home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 5 / Apprentice-Release5.iso / Information / CSMP Digest / volume 3 / csmp-digest-v3-141 < prev    next >
Text File  |  1996-03-23  |  119KB  |  3,131 lines

  1. C.S.M.P. Digest             Wed, 20 Mar 96       Volume 3 : Issue 141
  2.  
  3. Today's Topics:
  4.  
  5.         Async. Driver IO Questions - Need Help
  6.         Code For Changing Monitor Resolutions?
  7.         Do all functions -procedures allocate memory?
  8.         Drawing behind TE fields
  9.         How Often Do I Lock a Handle?
  10.         Limiting the mouse region
  11.         MOVE 16
  12.         Making sense of memory management
  13.         More than 255 chars with GetDialogItemText() ???
  14.         Multitasking w- WaitNextEvent()???
  15.         Program to Program Communication (PPCInform, PPCStart)
  16.         Q: The OSErr type, and unreserved values....
  17.         QD3D and Textures...
  18.         System 7 PopUp CDEF Shares MenuHandles?
  19.         Where can I get a CustomGetFolder that works?
  20.         Wrapping Pictures Around Closed QD3D Surfaces
  21.         [Q] Building Popup-menus at runtime
  22.  
  23.  
  24.  
  25. The Comp.Sys.Mac.Programmer Digest is moderated by Francois Pottier
  26. (pottier@clipper.ens.fr).
  27.  
  28. The digest is a collection of article threads from the internet
  29. newsgroups comp.sys.mac.programmer.help, csmp.tools, csmp.misc and
  30. csmp.games. It is designed for people who read news semi-regularly and
  31. want an archive of the discussions.  If you don't know what a
  32. newsgroup is, you probably don't have access to it. Ask your systems
  33. administrator(s) for details. If you don't have access to news, you
  34. may still be able to post messages to the group by using a mail server
  35. like anon.penet.fi (mail help@anon.penet.fi for more information).
  36.  
  37. Each issue of the digest contains one or more sets of articles (called
  38. threads), with each set corresponding to a 'discussion' of a particular
  39. subject.  The articles are not edited; all articles included in this digest
  40. are in their original posted form (as received by our news server at
  41. nef.ens.fr).  Article threads are not added to the digest until the last
  42. article added to the thread is at least two weeks old (this is to ensure that
  43. the thread is dead before adding it to the digest).  Article threads that
  44. consist of only one message are generally not included in the digest.
  45.  
  46. The digest is officially distributed by two means, by email and ftp.
  47.  
  48. If you want to receive the digest by mail, send email to listserv@ens.fr
  49. with no subject and one of the following commands as body:
  50.     help                        Sends you a summary of commands
  51.     subscribe csmp-digest Your Name    Adds you to the mailing list
  52.     signoff csmp-digest            Removes you from the list
  53. Once you have subscribed, you will automatically receive each new
  54. issue as it is created.
  55.  
  56. The official ftp info is ftp://ftp.dartmouth.edu/pub/csmp-digest.
  57. Questions related to the ftp site should be directed to
  58. scott.silver@dartmouth.edu.
  59.  
  60. -------------------------------------------------------
  61.  
  62. >From rajadhyaksha.2@osu.edu (Ram Rajadhyaksha)
  63. Subject: Async. Driver IO Questions - Need Help
  64. Date: Sat, 17 Feb 1996 02:33:09 -0500
  65. Organization: The Ohio State University
  66.  
  67. I'm back. :-) Anyways, I'm having a minor problem with a program that does
  68. a lot of intensive asynchronous IO with a SCSI driver. Occassionally I try
  69. to queue a read request and it dies with a result code of -36, which (oh
  70. my god!) happens to be: IO error. Real helpful.
  71.  
  72. Anyways, this only happens with VM turned on so I'm wondering if it is a
  73. problem with not properly locking my IO buffers. My current method, as
  74. recommended by another engineer, is to call LockMemoryContiguous and if
  75. that fails, call LockMemory. Does anyone have any clue about what I might
  76. be doing wrong? Is there a way I should reserve my buffers so they won't
  77. be affected by VM?
  78.  
  79. The second question is somewhat of a stupid one. If I decide to recompile
  80. this program for nativeness, how is my ioCompletion routine supposed to
  81. get passed a paramblock? On 68k, it's a simple deal of the device manager
  82. passing the pointer in register A0. 
  83.  
  84. Any help is greatly appreciated. Please email your responses since I don't
  85. get a chance to frequent this group often.
  86.  
  87. Thanks!
  88.  
  89. --Ram Rajadhyaksha
  90.  
  91. +++++++++++++++++++++++++++
  92.  
  93. >From wysocki@netcom.com (Chris Wysocki)
  94. Date: Sun, 18 Feb 1996 02:27:03 GMT
  95. Organization: NETCOM On-line Communication Services (408 261-4700 guest)
  96.  
  97. In article
  98. <rajadhyaksha.2-1702960233090001@ts29-10.homenet.ohio-state.edu>,
  99. rajadhyaksha.2@osu.edu (Ram Rajadhyaksha) wrote:
  100.  
  101. >I'm back. :-) Anyways, I'm having a minor problem with a program that does
  102. >a lot of intensive asynchronous IO with a SCSI driver. Occassionally I try
  103. >to queue a read request and it dies with a result code of -36, which (oh
  104. >my god!) happens to be: IO error. Real helpful.
  105. >
  106. >Anyways, this only happens with VM turned on so I'm wondering if it is a
  107. >problem with not properly locking my IO buffers. My current method, as
  108. >recommended by another engineer, is to call LockMemoryContiguous and if
  109. >that fails, call LockMemory. Does anyone have any clue about what I might
  110. >be doing wrong? Is there a way I should reserve my buffers so they won't
  111. >be affected by VM?
  112.  
  113. I'm fairly certain that the OS automatically holds the i/o buffer in
  114. physical memory via HoldMemory for Read and Write calls when VM is on, so
  115. you shouldn't need to do this yourself.  Have you tried testing with a
  116. different SCSI driver to see if there is possible a problem with the
  117. driver itself when VM is on?  Also, you should note the difference between
  118. HoldMemory and LockMemory; the former ensures that the range is held in
  119. physical memory (i.e. not paged to disk), while the latter both holds the
  120. logical address range and also prevents it from moving in physical
  121. memory.  Generally you don't need to call LockMemory unless you're
  122. providing a buffer to a hardware device for DMA, which you're generally
  123. not doing when you issue read/write calls to a device driver.
  124.  
  125. >The second question is somewhat of a stupid one. If I decide to recompile
  126. >this program for nativeness, how is my ioCompletion routine supposed to
  127. >get passed a paramblock? On 68k, it's a simple deal of the device manager
  128. >passing the pointer in register A0. 
  129.  
  130. Read up on the Mixed Mode Manager in IM: PowerPC System Software. 
  131. Basically you declare your i/o completion routine with the parameter block
  132. pointer as a formal parameter and provide a pointer to a routine
  133. descriptor in the ioCompletion field of the parameter block.  When the OS
  134. calls the ioCompletion routine, the Mixed Mode Manager will take care of
  135. moving the 68K A0 parameter into the proper location for your PowerPC
  136. completion routine to access it.  Basically the relevant code would look
  137. something like:
  138.  
  139. void PowerPCIOCompletionRoutine(ParmBlkPtr pb)
  140. {
  141.     // ...
  142. }
  143.  
  144. {
  145.     static RoutineDescriptor ioCompletionRD =
  146. BUILD_ROUTINE_DESCRIPTOR(uppIOCompletionProcInfo,
  147. PowerPCIOCompletionRoutine);
  148.  
  149.     pb.ioParam.ioCompletion = &ioCompletionRD;
  150.     // ...
  151.     err = PBWhateverAsync(&pb);
  152. }
  153.  
  154. Here I allocate the RoutineDescriptor as a static variable, so that I
  155. don't need to dynamically allocate memory for it (as would be necessary if
  156. the NewIOCompletionProc macro were used.)
  157.  
  158. Hope this helps.
  159.  
  160. Chris.
  161.  
  162. +++++++++++++++++++++++++++
  163.  
  164. >From kluev@macsimum.gamma.ru (Kluev)
  165. Date: Mon, 19 Feb 96 18:53:14 +0300
  166. Organization: (none)
  167.  
  168. In article <wysocki-1702961827030001@10.0.2.15>, wysocki@netcom.com
  169. (Chris Wysocki) wrote:
  170.  
  171. >In article
  172. ><rajadhyaksha.2-1702960233090001@ts29-10.homenet.ohio-state.edu>,
  173. >rajadhyaksha.2@osu.edu (Ram Rajadhyaksha) wrote:
  174. >
  175. >>I'm back. :-) Anyways, I'm having a minor problem with a program that
  176. does
  177. >>a lot of intensive asynchronous IO with a SCSI driver. Occassionally
  178. I try
  179. >>to queue a read request and it dies with a result code of -36, which
  180. (oh
  181. >>my god!) happens to be: IO error. Real helpful.
  182. >>
  183. >>Anyways, this only happens with VM turned on so I'm wondering if it
  184. is a
  185. >>problem with not properly locking my IO buffers. My current method,
  186. as
  187. >>recommended by another engineer, is to call LockMemoryContiguous and
  188. if
  189. >>that fails, call LockMemory. Does anyone have any clue about what I
  190. might
  191. >>be doing wrong? Is there a way I should reserve my buffers so they
  192. won't
  193. >>be affected by VM?
  194. >
  195. >I'm fairly certain that the OS automatically holds the i/o buffer in
  196. >physical memory via HoldMemory for Read and Write calls when VM is on,
  197. so
  198. >you shouldn't need to do this yourself.  Have you tried testing with a
  199.  
  200. I never understand how it could be done if Read/Write are queued
  201. at time when paging is unsafe. Do you know the answer?
  202.  
  203. - --------------------------------------------------------------
  204. Michael Kluev                            kluev@macsimum.gamma.ru
  205. Macintosh Programmer                           Physics Grad, MSU
  206. MACsimum Ltd.                                     Moscow, Russia
  207. - --------------------------------------------------------------
  208.  
  209. +++++++++++++++++++++++++++
  210.  
  211. >From Bob Gulian <bgulian@wco.com>
  212. Date: Tue, 27 Feb 1996 22:03:49 +0000
  213. Organization: West Coast Online's News Server - Not responsible for content
  214.  
  215. Ram Rajadhyaksha wrote:
  216.  
  217. > The second question is somewhat of a stupid one. If I decide to recompile
  218. > this program for nativeness, how is my ioCompletion routine supposed to
  219. > get passed a paramblock? On 68k, it's a simple deal of the device manager
  220. > passing the pointer in register A0.
  221.  
  222. In PPC native it's a simple matter of the paramblock ptr being passed 
  223. in R3.  In fact, it's even simpler on PPC because an iocompletion 
  224. routine typedef with a ParamBlkPtr as an argument is declared in 
  225. File.h so all you need to do is declare one callback header for 68k 
  226. and one PPC and use #ifdefs.
  227.  
  228. +++++++++++++++++++++++++++
  229.  
  230. >From mcmurtri@wco.com (Kevin McMurtrie)
  231. Date: Wed, 06 Mar 1996 22:02:04 -0800
  232. Organization: hardly any
  233.  
  234. In article
  235. <rajadhyaksha.2-1702960233090001@ts29-10.homenet.ohio-state.edu>,
  236. rajadhyaksha.2@osu.edu (Ram Rajadhyaksha) wrote:
  237.  
  238. >I'm back. :-) Anyways, I'm having a minor problem with a program that does
  239. >a lot of intensive asynchronous IO with a SCSI driver. Occassionally I try
  240. >to queue a read request and it dies with a result code of -36, which (oh
  241. >my god!) happens to be: IO error. Real helpful.
  242. >
  243. >Anyways, this only happens with VM turned on so I'm wondering if it is a
  244. >problem with not properly locking my IO buffers. My current method, as
  245. >recommended by another engineer, is to call LockMemoryContiguous and if
  246. >that fails, call LockMemory. Does anyone have any clue about what I might
  247. >be doing wrong? Is there a way I should reserve my buffers so they won't
  248. >be affected by VM?
  249.  
  250. You should call LockMemory on your parameter block and with Status and
  251. Control calls the buffers too.  It is also possible that VM is screwing up
  252. timiming of I/O and causing hardware problems.  I wrote a program to read
  253. audio CDs and error -36 happened so much that I made a thread watch each
  254. I/O request and automaticly retry on errors.
  255.  
  256. >The second question is somewhat of a stupid one. If I decide to recompile
  257. >this program for nativeness, how is my ioCompletion routine supposed to
  258. >get passed a paramblock? On 68k, it's a simple deal of the device manager
  259. >passing the pointer in register A0. 
  260. >
  261. >Any help is greatly appreciated. Please email your responses since I don't
  262. >get a chance to frequent this group often.
  263. >
  264. >Thanks!
  265. >
  266. >--Ram Rajadhyaksha
  267.  
  268. ---------------------------
  269.  
  270. >From chance59@wavenet.com (R. T. Chancellor)
  271. Subject: Code For Changing Monitor Resolutions?
  272. Date: Tue, 20 Feb 1996 20:19:03 -0700
  273. Organization: A Customer of Wavenet
  274.  
  275. Shockwave Assault has a really nice option that dynamically resets the
  276. monitor's resolution so that you get full screen action. It then resets
  277. the resolution back (upon quitting) so that the Finder does not do that
  278. pesky shuffle of icons to fit on the Desktop.
  279.  
  280. Does anyone know where I might get a code example of how to do this (in C) ?
  281.  
  282. +++++++++++++++++++++++++++
  283.  
  284. >From ntrlbnkilr@aol.com (NtrlBNkilr)
  285. Date: 21 Feb 1996 19:12:49 -0500
  286. Organization: America Online, Inc. (1-800-827-6364)
  287.  
  288. If you have access to any of the Inside Macintosh on CD resources....check
  289. out the info on the Display Manager...it can manipulate all aspects of the
  290. display environment.
  291.  
  292.  
  293. +++++++++++++++++++++++++++
  294.  
  295. >From phixus@deltanet.com (Chris De Salvo)
  296. Date: Thu, 22 Feb 1996 03:49:48 -0800
  297. Organization: MacPlay
  298.  
  299. In article <chance59-2002962019030001@la-dial2-05.wavenet.com>,
  300. chance59@wavenet.com (R. T. Chancellor) wrote:
  301.  
  302. >Shockwave Assault has a really nice option that dynamically resets the
  303. >monitor's resolution so that you get full screen action. It then resets
  304. >the resolution back (upon quitting) so that the Finder does not do that
  305. >pesky shuffle of icons to fit on the Desktop.
  306. >
  307. >Does anyone know where I might get a code example of how to do this (in C) ?
  308.  
  309. Well, you got two real options.
  310.  
  311. 1)  Use the new QuickTime 2.1 call BeginFullScreenMode().  It's a rad
  312. call.  All at once it can:
  313.  
  314.    o Hide the menubar
  315.    o Change the monitor resolution
  316.    o Create a full-screen window for you
  317.    o Clear the window to a particular RGB color
  318.  
  319.    Not bad for one function call.
  320.  
  321. 2)  Use the Display Manager routines.  However, doing this requires that
  322. you have to have System 7.5 or newer to make sure that the Display Manager
  323. is present.
  324.  
  325. L8R
  326. Chris
  327.  
  328. -- 
  329. phixus@deltanet.com         |   Macintosh:  Changing the world,
  330. Chris De Salvo              |        one person at a time!
  331. Professional Mac Geek       |    -----------------------------
  332. for MacPlay, Inc.           |      (I wish they'd hurry up!)
  333.  
  334.            http://www.deltanet.com/users/phixus
  335.  
  336. +++++++++++++++++++++++++++
  337.  
  338. >From dalawren@netcom.com (David Lawrence)
  339. Date: Fri, 23 Feb 1996 09:11:40 GMT
  340. Organization: NETCOM On-line Communication Services (408 261-4700 guest)
  341.  
  342. In article <phixus-2202960349480001@ana0005.deltanet.com>,
  343. phixus@deltanet.com (Chris De Salvo) wrote:
  344.  
  345. > In article <chance59-2002962019030001@la-dial2-05.wavenet.com>,
  346. > chance59@wavenet.com (R. T. Chancellor) wrote:
  347. > >Shockwave Assault has a really nice option that dynamically resets the
  348. > >monitor's resolution so that you get full screen action. It then resets
  349. > >the resolution back (upon quitting) so that the Finder does not do that
  350. > >pesky shuffle of icons to fit on the Desktop.
  351. > >
  352. > >Does anyone know where I might get a code example of how to do this (in C) ?
  353. > Well, you got two real options.
  354. > 1)  Use the new QuickTime 2.1 call BeginFullScreenMode().  It's a rad
  355. > call.  All at once it can:
  356. >    o Hide the menubar
  357. >    o Change the monitor resolution
  358. >    o Create a full-screen window for you
  359. >    o Clear the window to a particular RGB color
  360. >    Not bad for one function call.
  361. > 2)  Use the Display Manager routines.  However, doing this requires that
  362. > you have to have System 7.5 or newer to make sure that the Display Manager
  363. > is present.
  364.  
  365.  
  366.  
  367. We also included resolution switching in Warcraft.  I'll talk about our
  368. experience with it in a second.  First I want to say that the code is now
  369. available to easily switch resolutions, so I hope that every game from now
  370. on includes this feature.  Switching manually is a pain. I always forget
  371. to do it, so I have to quit the game, go to the Monitors control panel,
  372. switch resolutions, then relaunch the game! What a pain! I hate when I
  373. forget to do it!
  374.  
  375. Now, back to buisness:
  376.  
  377. I'm pretty sure that the QuickTime 2.1's BeginFullScreenMode() call
  378. requires Display Manager 2.0 to switch resolutions.  When QuickTime 2.1
  379. came out, I tried using this call, but didn't get a resolution switch.  It
  380. hid the menu bar, and it created a full screen window, but the monitor
  381. didn't switch to 640x480 like I requested.  I was using a Q630 and a 7100,
  382. both with System 7.5.
  383.  
  384. I haven't tried it since installing Display Enabler 2.0, but I assume this
  385. was the missing piece.
  386.  
  387. In Warcraft, we used the sample code from the Display Manager Developer
  388. Kit, which is on the Developer CDs.  It allows switching resolutions with
  389. Display Manager 1.0 or 2.0.  With DM 1.0, you should only use this sample
  390. code to switch resolutions if there is one monitor.  With multiple
  391. monitors, it won't "gravitate" the monitors so that they are all touching
  392. on the desktop.  DM 2.0 will always do this for you.
  393.  
  394. Display Manager 1.0 is included with all PowerMacs (System 7.1.2), and
  395. with System 7.5.   Display Manager 2.0 is included in all System software
  396. after 7.5.1, including 7.5.2 with the PCI Macs.  It is also available as
  397. an extension from Apple at:
  398.  
  399. <ftp://ftp.info.apple.com//Apple.Support.Area/Apple.Software.Updates/US/
  400. Macintosh/Display_and_Peripheral/Display_Software_2.0.sea.hqx>
  401.  
  402.  
  403. Display Manager can be licensed from Apple, no charge.
  404.  
  405. There are a few things to look out for if you want to use the sample
  406. code.  On PPC, the calls that are new to DM 2.0 require the Display
  407. Library in addition to Display Enabler 2.0.  Display Library is included
  408. in the Display Manager Developer Kit.  It is NOT installed on PCI Macs,
  409. even though they ship with DM 2.0.  If you want to use DM 2.0 calls on a
  410. PPC, you must either install Display Library into the Extensions folder
  411. (or your app's folder), or compile it into your application.  (I'm not
  412. sure how, but I know its possible.)
  413.  
  414. Also, the sample code correctly looks for the version of DM using Gestalt
  415. before making DM calls, but it doesn't look to see if Display Library is
  416. loaded.  If you "weak link" DiaplyLib, you can run without Display
  417. Library, but you must do this before making DM 2.0 calls:
  418.  
  419. #if GENERATINGCFM
  420. if ( (Ptr) DMGetDisplayMode == (Ptr) kUnresolvedCFragSymbolAddress ) {
  421.    // Display Manager 2.0 is NOT installed.
  422. }
  423. #endif
  424.  
  425.  
  426. The other problem with switching resolutions is those pesky finder icons! 
  427. When you shrink your monitor size, the Finder's icons are repositioned,
  428. but when you increase resolution again, they don't move back, so they end
  429. up in the middle of the monitor.  The icons are repositioned when the
  430. Finder gets an event from Display Manager telling it that the display
  431. configuration has changed.
  432.  
  433. One of the programmers of Shockwave Assault explained a while back how
  434. they avoided this problem.  First, they don't procces events between
  435. resolution switches.  Second, they don't call DMEndConfigureDisplays()
  436. until after the second resolution switch, so when the Finder gets that
  437. event from Display Manager, the resolution is back to its original
  438. settings, so no icon repositioning is needed.
  439.  
  440. This clever technique works OK for games that take over the computer and
  441. don't process events, but it won't work if you want to allow switching to
  442. other applications or to the Finder while the game is running.  The Finder
  443. icons will be offscreen, along with other applications' windows.
  444.  
  445. Another possible solution to the icon problem is to use AppleEvents to get
  446. the icon positions and restore them when the game quits, like Quinn's
  447. Snapshotter utility does.  I looked into this a little bit, but I haven't
  448. had time to figure out the necessary AppleEvent stuff yet.
  449.  
  450.  
  451. So, if you want resolution switching, license Display Manager 2.0 from
  452. Apple, and include it with your game.  If you are going to require
  453. QuickTime 2.1 for your game, use the BeginFullScreenMode() call.  If you
  454. don't want to require QT 2.1, use the sample code in the DM Dev. Kit.  It
  455. is simple to use - just include the source files, and make a few calls in
  456. your code.  (Just don't forget to add the check for Display Library.)
  457.  
  458. If anyone writes code to reposition Finder icons, I'm sure no one will
  459. complain if you post it here!
  460.  
  461.  
  462.     David Lawrence
  463.     Future Tense
  464.  
  465. +++++++++++++++++++++++++++
  466.  
  467. >From pottier@drakkar.ens.fr (Francois Pottier)
  468. Date: 25 Feb 1996 11:54:23 GMT
  469. Organization: Ecole Normale Superieure, Paris, France
  470.  
  471. In article <dalawren-2302960111410001@arrington.dscnet.com>,
  472. David Lawrence <dalawren@netcom.com> wrote:
  473.  
  474. >If anyone writes code to reposition Finder icons, I'm sure no one will
  475. >complain if you post it here!
  476.  
  477. Full source code to do this appeared on the Develop CD about a year
  478. ago.
  479.  
  480. -- 
  481. Francois Pottier
  482. Francois.Pottier@ens.fr
  483. Francois.Pottier@inria.fr
  484. http://www.eleves.ens.fr:8080/home/pottier/
  485.  
  486. +++++++++++++++++++++++++++
  487.  
  488. >From meggs@virginia.edu (Andrew Meggs)
  489. Date: Sat, 24 Feb 1996 16:29:16 GMT
  490. Organization: University of Virginia
  491.  
  492. In article <dalawren-2302960111410001@arrington.dscnet.com>,
  493. dalawren@netcom.com (David Lawrence) wrote:
  494. > There are a few things to look out for if you want to use the sample
  495. > code.  On PPC, the calls that are new to DM 2.0 require the Display
  496. > Library in addition to Display Enabler 2.0.  Display Library is included
  497. > in the Display Manager Developer Kit.  It is NOT installed on PCI Macs,
  498. > even though they ship with DM 2.0.  If you want to use DM 2.0 calls on a
  499. > PPC, you must either install Display Library into the Extensions folder
  500. > (or your app's folder), or compile it into your application.  (I'm not
  501. > sure how, but I know its possible.)
  502.  
  503. You don't compile it into your application, rather, you include it as
  504. a code fragment in your application's data fork along with the fragment
  505. containing the app's own code. The CFM is more flexible than most people
  506. realize -- you can put more than one fragment in a single file, provided
  507. that you set up the 'cfrg' resource correctly.
  508.  
  509. Luckily, Apple provides an MPW tool to do this for us, called "mergefragment".
  510. For development, I just use CW to build the app, and leave Display Library
  511. in the same folder. But when I send a copy off my machine, I run this
  512. little MPW/ToolServer script:
  513.  
  514.   duplicate -y "development app" "distribution app"
  515.   mergefragment -p "Display Library" "distribution app"
  516.  
  517. And then I've got a file called "distribution app" that contains both the
  518. fragment from the CW build and the Display Library fragment.
  519.  
  520. -- 
  521. _________________________________________________________________________
  522. andrew meggs                               the one who dies with the most
  523. meggs@virginia.edu                              AOL free trial disks wins
  524.  
  525. +++++++++++++++++++++++++++
  526.  
  527. >From johnb@hk.super.net (John W. Blackburne)
  528. Date: Mon, 26 Feb 1996 21:30:07 +0800
  529. Organization: Tempest
  530.  
  531. In article <phixus-2202960349480001@ana0005.deltanet.com>,
  532. phixus@deltanet.com (Chris De Salvo) wrote:
  533.  
  534. :In article <chance59-2002962019030001@la-dial2-05.wavenet.com>,
  535. :chance59@wavenet.com (R. T. Chancellor) wrote:
  536. :
  537. :>Shockwave Assault has a really nice option that dynamically resets the
  538. :>monitor's resolution so that you get full screen action. It then resets
  539. :>the resolution back (upon quitting) so that the Finder does not do that
  540. :>pesky shuffle of icons to fit on the Desktop.
  541. :>
  542. :>Does anyone know where I might get a code example of how to do this (in C) ?
  543. :
  544. :[...]
  545. :
  546. :2)  Use the Display Manager routines.  However, doing this requires that
  547. :you have to have System 7.5 or newer to make sure that the Display Manager
  548. :is present.
  549.  
  550. I think the requirement is 7.1.2 or later - Display Manager version 1 is
  551. part of the standard system software on all PowerPC Macs, which was the
  552. only way to get  7.1.2. I'm not sure what you get if you install 7.1.2 on
  553. 68k Macs. It then appeared in System 7.5, along with almost every other
  554. system software component released in the previous 2 years.
  555.  
  556. Version 2 of the dispaly manager, which you need to suppport resolution
  557. switching with 2 or more monitors, is built into System 7.5.2, comes with
  558. some monitors and will probably also appear in System 7.5.3/System Update
  559. 2.0. It's also avaialble as an extension & shared library which I think is
  560. freely licenceable for distribution if you subscribe to the MacOS
  561. SDK/developer subscription.
  562.  
  563. John
  564. -- 
  565. John Blackburne,                     johnb@tempest.net.hk
  566. Programmer  Asia, Inc. Online:       http://www.asia-inc.com
  567. Technology consultant and trainer:   http://www.hk.super.net/~johnb
  568.  
  569. +++++++++++++++++++++++++++
  570.  
  571. >From jan.melander@got.wmdata.se (Jan Melander)
  572. Date: Mon, 26 Feb 1996 15:49:14 GMT
  573. Organization: WM-Data
  574.  
  575. In article <phixus-2202960349480001@ana0005.deltanet.com>,
  576. phixus@deltanet.com (Chris De Salvo) wrote:
  577.  
  578. >In article <chance59-2002962019030001@la-dial2-05.wavenet.com>,
  579. >chance59@wavenet.com (R. T. Chancellor) wrote:
  580. >
  581. >>Shockwave Assault has a really nice option that dynamically resets the
  582. >>monitor's resolution so that you get full screen action. It then resets
  583. >>the resolution back (upon quitting) so that the Finder does not do that
  584. >>pesky shuffle of icons to fit on the Desktop.
  585. >>
  586. >>Does anyone know where I might get a code example of how to do this (in C) ?
  587. >
  588. >Well, you got two real options.
  589. >
  590. >1)  Use the new QuickTime 2.1 call BeginFullScreenMode().  It's a rad
  591. >call.  All at once it can:
  592. >
  593. >   o Hide the menubar
  594. >   o Change the monitor resolution
  595. >   o Create a full-screen window for you
  596. >   o Clear the window to a particular RGB color
  597. >
  598. >   Not bad for one function call.
  599. >
  600. >2)  Use the Display Manager routines.  However, doing this requires that
  601. >you have to have System 7.5 or newer to make sure that the Display Manager
  602. >is present.
  603. >
  604. >L8R
  605. >Chris
  606. >
  607.  
  608. One bad thing tough...
  609. When I started the Shockwave demo my Gravis MouseStick II driver loaded
  610. the appropriate stick set but also remebered the screen size, so when the
  611. game changed the screen size the center position of the joystick was way
  612. off!!!
  613.  
  614. Otherwise this is a great idea,  Gravis are You listening?
  615.  
  616. Cheers,
  617.  
  618. -- 
  619. - -------------------------------------------------------------
  620.         Jan Melander
  621.         WM-Data
  622.         jan.melander@got.wmdata.se
  623. - -------------------------------------------------------------
  624. Q:Why didn't Intel name their CPU 586 instead of Pentium?
  625. A:When they added 100 to 486 the readout said 585.9999999999765,
  626.   and it didn't fit on the chip.
  627.  
  628. +++++++++++++++++++++++++++
  629.  
  630. >From cconway@ea.com (Chris Conway)
  631. Date: Tue, 27 Feb 1996 00:49:22 -0800
  632. Organization: Electronic Arts
  633.  
  634. > When I started the Shockwave demo my Gravis MouseStick II driver loaded
  635. > the appropriate stick set but also remebered the screen size, so when the
  636. > game changed the screen size the center position of the joystick was way
  637. > off!!!
  638. > Otherwise this is a great idea,  Gravis are You listening?
  639.  
  640. Hmmmm.  I tested the game with a few joysticks, and the Gravis MouseStick
  641. was the only one that handled the monitor change successfully for me! 
  642. Maybe you don't have the latest Gravis software or I was just lucky...
  643.  
  644. This is a problem that the joystick people need to address...  I think
  645. more and more games are going to start doing this (it's a really nice
  646. feature) and it isn't very nice if you're joystick software can't handle
  647. it.
  648.  
  649. Chris Conway
  650. Electronic Arts
  651.  
  652. +++++++++++++++++++++++++++
  653.  
  654. >From bwade@qualia.com (Bretton Wade)
  655. Date: Tue, 27 Feb 1996 00:27:23 -0500
  656. Organization: qualia, inc.
  657.  
  658. In article <jan.melander-2602961542330001@jmmac.got.wmdata.se>,
  659. jan.melander@got.wmdata.se (Jan Melander) wrote:
  660.  
  661. # One bad thing tough...
  662. # When I started the Shockwave demo my Gravis MouseStick II driver loaded
  663. # the appropriate stick set but also remebered the screen size, so when the
  664. # game changed the screen size the center position of the joystick was way
  665. # off!!!
  666.  
  667. I had a similar problem in using the Apple source. I haven't yet figured
  668. out a way around it, are there any suggestions?
  669.  
  670. -- 
  671. bwade@qualia.com
  672. http://www.qualia.com/~bwade/
  673.  
  674. +++++++++++++++++++++++++++
  675.  
  676. >From blossom@slip.net (Jon Blossom)
  677. Date: Tue, 27 Feb 1996 18:59:07 GMT
  678. Organization: (none)
  679.  
  680. >Does anyone know where I might get a code example of how to do this (in C) ?
  681.  
  682. My article in the next Game Developer magazine (April/May issue)
  683. includes complete code for switching the monitor resolution and
  684. creating a full-screen double-buffered environment using GWorlds. The
  685. code uses Display Manager 2.0 and doesn't include all the features you
  686. might want (hey, it's in a magazine!), but it's a good start, and I
  687. think it's more immediately understandable than the Apple sample code.
  688.  
  689. -Jon Blossom
  690. blossom@slip.net
  691.  
  692.  
  693.  
  694. ---------------------------
  695.  
  696. >From Howard Salmon <captarm@azstarnet.com>
  697. Subject: Do all functions -procedures allocate memory?
  698. Date: 28 Feb 1996 06:43:32 GMT
  699. Organization: Arizona Daily Star - AZSTARNET
  700.  
  701. Advice from Inside Mac is that we should lock blocks of memory 
  702. sparingly, lest we call a function that "allocates memory".
  703.  
  704. My questions:
  705. 1.  How does a function "allocate" memory?  Doesn't it make a call for 
  706. memory?  I thought the Memory Manager allocated the memory.
  707.  
  708. 2. Don't all functions allocate memory?  
  709.  
  710. 3. How to decide which blocks to lock?  --or--How to determine which 
  711. functions allocate memory?
  712.  
  713. These questions inspired by the Inside Mac passage which reads:
  714. "the handle myData needs to be locked before the WITH statement because 
  715. the functions TENew and GetNewControl allocate memory and hence might 
  716. move the block whose handle is myData."
  717.  
  718. Any clarification for my confused novice mind would be greatly 
  719. appreciated. --Howard Salmon (captarm@azstarnet.com)
  720.  
  721.  
  722.  
  723. +++++++++++++++++++++++++++
  724.  
  725. >From johnston@fapse.unige.ch (Tom Johnstone)
  726. Date: Wed, 28 Feb 1996 20:08:39 +0100
  727. Organization: University of Geneva
  728.  
  729. As another Mac programming novice I would also like to know the answer to
  730. this question. It seems that one is able to either use LOCK to prevent a
  731. block of data (say the value of a variable) from being moved, or one can
  732. use a local variable to save the data before calling the "memory
  733. allocating" function. I read something about this in the Think Pascal
  734. manual, but I don't really understand it. Could people post me their
  735. replies too please?
  736.  
  737. Thanks for the help
  738. Tom
  739.  
  740. In article <4h0tik$4m3@news.azstarnet.com>, Howard Salmon
  741. <captarm@azstarnet.com> wrote:
  742.  
  743. >My questions:
  744. >1.  How does a function "allocate" memory?  Doesn't it make a call for 
  745. >memory?  I thought the Memory Manager allocated the memory.
  746. >
  747. >2. Don't all functions allocate memory?  
  748. >
  749. >3. How to decide which blocks to lock?  --or--How to determine which 
  750. >functions allocate memory?
  751. >
  752. >These questions inspired by the Inside Mac passage which reads:
  753. >"the handle myData needs to be locked before the WITH statement because 
  754. >the functions TENew and GetNewControl allocate memory and hence might 
  755. >move the block whose handle is myData."
  756. >
  757.  
  758. o---------------------------------------------------------------------o
  759. | Tom Johnstone                                                       |
  760. | Faculte de Psychologie                Tel.  +41-22-705 9777         |
  761. | et des Sciences de l'Education        Fax   +41-22-300 1482         |
  762. | Universite de Geneve                                                |
  763. | 9, route de Drize                                                   |
  764. | CH-1227 Carouge-Geneve          email: johnston@fapse.unige.ch      |
  765. |                                                                     |
  766. | http://www.unige.ch/fapse/emotion/members/johnston/johnston.html    |
  767. o---------------------------------------------------------------------o
  768.  
  769. +++++++++++++++++++++++++++
  770.  
  771. >From sample@esltd.com (Don Sample)
  772. Date: Thu, 29 Feb 1996 16:54:57 -0500
  773. Organization: Enerprise Solutions Ltd
  774.  
  775. In article <4h0tik$4m3@news.azstarnet.com>, Howard Salmon
  776. <captarm@azstarnet.com> wrote:
  777.  
  778. >My questions:
  779. >1.  How does a function "allocate" memory?  Doesn't it make a call for 
  780. >memory?  I thought the Memory Manager allocated the memory.
  781. >
  782. >2. Don't all functions allocate memory?  
  783. >
  784. >3. How to decide which blocks to lock?  --or--How to determine which 
  785. >functions allocate memory?
  786. >
  787. >These questions inspired by the Inside Mac passage which reads:
  788. >"the handle myData needs to be locked before the WITH statement because 
  789. >the functions TENew and GetNewControl allocate memory and hence might 
  790. >move the block whose handle is myData."
  791. >
  792.  
  793. 1: There are generally two ways to allocate memory.  On the stack, or in
  794. the heap. Function parameters and local variables are allocated on the
  795. stack (They may also be in registers, but you don't usually have to worry
  796. about that).  You can also allocate memory dynamically in the heap using
  797. Memory Manager functions such as NewHandle and NewPointer.
  798.  
  799. 2: It is possible to write functions which do not allocate any memory.  If
  800. they don't have any parameters, or local variables then no memory will be
  801. allocated for them.
  802.  
  803. 3: When to lock:
  804.     a)  You only lock data allocated through NewHandle (or one of its close 
  805.         relatives)
  806.     b)  You only lock a handle if you dereference it, and then make a call
  807.         to something which may move memory.  The Pascal WITH statement is
  808.         particularily nasty in this respect because it does an implicit
  809.         dereference of a handle behind your back (hence the IM warning).
  810.     c)  rather than locking handles it is often preferable to either
  811.         re-arrange your code, or make local copies of the data in the
  812.         handle.
  813.  
  814. -- 
  815. Don Sample (sample@esltd.com)           |  Quando Omni Flunkus
  816. Enterprise Solutions Ltd.               |        Moritati
  817. http://www.esltd.com/esl_people/sample/ |
  818.  
  819. +++++++++++++++++++++++++++
  820.  
  821. >From <williamt@aloha.com>
  822. Date: 2 Mar 1996 06:42:36 GMT
  823. Organization: FlexNet Inc, HAWAII
  824.  
  825. Howard Salmon <captarm@azstarnet.com> wrote:
  826. >Advice from Inside Mac is that we should lock blocks of memory 
  827. >sparingly, lest we call a function that "allocates memory".
  828. >
  829. >My questions:
  830. >1.  How does a function "allocate" memory?  Doesn't it make a call for 
  831. >memory?  I thought the Memory Manager allocated the memory.
  832. >
  833. >2. Don't all functions allocate memory?  
  834. >
  835. >3. How to decide which blocks to lock?  --or--How to determine which 
  836. >functions allocate memory?
  837. >
  838. >These questions inspired by the Inside Mac passage which reads:
  839. >"the handle myData needs to be locked before the WITH statement because 
  840. >the functions TENew and GetNewControl allocate memory and hence might 
  841. >move the block whose handle is myData."
  842. >
  843. >Any clarification for my confused novice mind would be greatly 
  844. >appreciated. --Howard Salmon (captarm@azstarnet.com)
  845. >
  846.  
  847. ..ask tricky questions, get tricky answers...
  848.  
  849. Keep studying Inside Mac. Apple emphasizes allocating memory dynamically, accessing it 
  850. via handles, and locking it down when you're using it. ONLY whe
  851. n you're actively using 
  852. it, though, else you break the concept of relocatable memory blocks. Like, if you're 
  853. about to write to the memory, or call an OS trap that'll write to it, lock it 
  854. down...then unlock it right away, after you're done writing, so the memory block can 
  855. float around in the physical RAM if it needs to.
  856.  
  857. Sometimes Inside Mac tells you explicitly to lock down a routine, as you said in 
  858. your example...that's an exception to the rule. Follow their advice. If an OS trap 
  859. allocates me
  860. mory, Apple generally tells you so (hint: if they say you can't use a 
  861. function during interrupts, it's probably because it allocates memory).
  862.  
  863. Lots of Mac OS traps allocate some memory to do their work. If you're passing data 
  864. to one of those functions, you'll often lock down your data so it doesn't get moved 
  865. around when the function asks for some memory. Otherwise the trap would write to 
  866. where your data USED to be (with wildly unpredictable results!).
  867.  
  868. Read up on how the stack is compressed and defragmented by the Memory Mgr. Remember 
  869. to unlock your locked handles after you (or the Mac trap) are done using them; 
  870. if you don't further need them in the program, release them with a Dispose function.
  871.  
  872. One thing that does confuse lots of people is that all functions (C, same with other 
  873. languages) do use memory...but they take stack memory, not dynamically allocated 
  874. blocks. Stack memory is fixed when the C program begins execution; in CW and Symantec, 
  875. you set it in a dialog (you can also set it directly, as in MPW, using a Mac trap). 
  876. A C function stores the context (the caller, the return address, called a frame), 
  877. the parameters passed to it, and the local variables, all on the stack. If that 
  878. function calls other functions, they, too, add to the stack demands. It all adds up 
  879. and the bigger the nested set of functions, the more stack needed.
  880.  
  881.  
  882.  
  883. +++++++++++++++++++++++++++
  884.  
  885. >From dnebing@epix.net (Dave Nebinger)
  886. Date: Fri, 01 Mar 1996 09:50:42 -0500
  887. Organization: KHP Services, Inc
  888.  
  889. In article <sample-2902961654570001@receptacle.esltd.com>,
  890. sample@esltd.com (Don Sample) wrote:
  891.  
  892. > 2: It is possible to write functions which do not allocate any memory.  If
  893. > they don't have any parameters, or local variables then no memory will be
  894. > allocated for them.
  895.  
  896. Depending on the settings for your compiler and optimizer, you may still
  897. generate
  898. a stack frame for a function on the stack whether it has parms & locals or
  899. not.
  900.  
  901. > 3: When to lock:
  902. >     a)  You only lock data allocated through NewHandle (or one of its close 
  903. >         relatives)
  904.            Be sure to include the GetResource() routines as "one of the
  905. close relatives".
  906.  
  907. >     c)  rather than locking handles it is often preferable to either
  908. >         re-arrange your code, or make local copies of the data in the
  909. >         handle.
  910.  
  911. It hardly seems worth it to rearrange code or make temporary copies if you
  912. just need a quick dereference of the handle's data.  HLock() and HUnlock()
  913. are more appropriate and faster.
  914.  
  915. However, you do want to avoid the practice of allocating a handle and locking
  916. it, unless the handle's lifetime is very short.  Only HLock() when you need to,
  917. and HUnlock() as soon as you are able.
  918.  
  919. Dave.
  920.  
  921. ==========================================================
  922. Dave Nebinger                             dnebing@epix.net
  923.              The Alt.Sources.Mac Archivist
  924.      <http://www.AmbrosiaSW.com/alt.sources.mac/>
  925.     <ftp://ftp.AmbrosiaSW.com/pub/alt.sources.mac/>
  926.  
  927. +++++++++++++++++++++++++++
  928.  
  929. >From gurgle@apple.com (Pete Gontier)
  930. Date: Wed, 28 Feb 1996 17:45:01 -0800
  931. Organization: Apple Computer, Inc.
  932.  
  933. In article <4h0tik$4m3@news.azstarnet.com>
  934. Howard Salmon <captarm@azstarnet.com> wrote:
  935.  
  936.  > Advice from Inside Mac is that we should lock blocks of memory 
  937.  > sparingly, lest we call a function that "allocates memory".
  938.  
  939. All such advice is necessarily an overgeneralization. The key fact is that
  940. Memory Manager attempt to coalesce multiple free blocks and move allocated
  941. blocks around to make optimal use of the existing space inside a heap. If
  942. you lock a block down in the middle of the heap, Memory Manager has fewer
  943. options than if you had first called MoveHHi. Functions which allocate
  944. memory are the ones which generally cause the heap to shuffle like this,
  945. although other calls like MoveHHi do as well.
  946.  
  947.  > 1.  How does a function "allocate" memory?  Doesn't it make a call for 
  948.  > memory?  I thought the Memory Manager allocated the memory.
  949.  
  950. NewPtr, NewHandle. Yes, the aforementioned two calls and variants on them. Yes.
  951.  
  952.  > 2. Don't all functions allocate memory?  
  953.  
  954. There are two answers here.
  955.  
  956. [1] If you have a function 'foo' in your program and it lives in the same
  957. code segment as function 'bar' and 'foo' calls 'bar' and 'bar' doesn't
  958. call any functions which move memory or live in another code segment,
  959. 'bar' will not move memory. For example:
  960.  
  961.     static unsigned long bar (void)
  962.     {
  963.         return 12;
  964.     }
  965.  
  966.     static void foo (void)
  967.     {
  968.          unsigned long b = bar ( );
  969.     }
  970.  
  971. [2] Most system calls move memory. Most of the ones that don't these days
  972. are the ones used by Memory Manager to move memory. :-) For example,
  973. StripAddress, BlockMove. Other calls which don't move memory include
  974. asynchronous i/o calls, which can't move memory because they're supposed
  975. to be callable at interrupt time, when memory might be moving.
  976.  
  977.  > 3. How to decide which blocks to lock?  --or--How to determine which 
  978.  > functions allocate memory?
  979.  
  980. The basic rule I follow these days just because I'm getting to be a
  981. conservative old man is to assume all calls move memory. That's not true,
  982. but it serves me well. It doesn't mean you have to lock any handles you
  983. have lying around whenever you call any old routine.
  984.  
  985. The only time you need to lock a handle is when you get a copy of its
  986. master pointer and want to keep it around across a call or want to pass it
  987. to a routine which might not know it is getting a copy of a master pointer
  988. of an unlocked handle or might be in another segment. Here's how you might
  989. get a copy of a master pointer:
  990.  
  991.     static void baz (Ptr p)
  992.     {
  993.         // do something that moves memory
  994.         char c = *p;
  995.         // c may now be bogus because the block
  996.         // referred to by 'h' below may have moved
  997.     }
  998.  
  999.     static void quux (Handle h)
  1000.     {
  1001.         baz (*h); // master pointer of presumably unlocked handle
  1002.     }
  1003.  
  1004. OK, but how do you avoid this without taking the time to lock the handle?
  1005. Well, note that 'baz' doesn't really need 'p', it just needs 'c'. 'baz'
  1006. could be redefined to accept a 'char' instead of a 'Ptr'. That would make
  1007. the problem go away, because 'quux' would simply pass '**h' instead of
  1008. '*h'. It's quite often the case that you'll save code space and debugging
  1009. time by simply copying the small pieces you need out of a handle and
  1010. passing them around instead of the handle itself or the handle's master
  1011. pointer. If you did want to pass the master pointer around, 'quux' should
  1012. probably be rewritten to look something like this:
  1013.  
  1014.     static OSErr quux2 (Handle h)
  1015.     {
  1016.         OSErr err = noErr;
  1017.  
  1018.         char hState = HGetState (h); // save 'locked' bit
  1019.         if (!(err = MemError ( )))
  1020.         {
  1021.             MoveHHi (h);
  1022.             if (!(err = MemError ( )))
  1023.             {
  1024.                 HLock (h);
  1025.                 if (!(err = MemError ( )))
  1026.                 {
  1027.                     bax (*h);
  1028.                     HSetState (hState,h); // restore 'locked' bit
  1029.                     if (!err) err = MemError ( );
  1030.                 }
  1031.             }
  1032.         }
  1033.  
  1034.         return err;
  1035.     }
  1036.  
  1037. Note: I wrote this code off the top of my head. It probably doesn't even
  1038. compile. Your mileage may vary. One vehicle at this price. Void where
  1039. prohibited.
  1040.  
  1041.  > These questions inspired by the Inside Mac passage which reads:
  1042.  > "the handle myData needs to be locked before the WITH statement because 
  1043.  > the functions TENew and GetNewControl allocate memory and hence might 
  1044.  > move the block whose handle is myData."
  1045.  
  1046. The WITH statement in question probably half-deferences a handle as in
  1047. 'baz', above.
  1048.  
  1049. - -
  1050.  
  1051.   Pete Gontier, Integer Poet, Apple Macintosh Developer Technical Support
  1052.  
  1053.   work      mail  <mailto:gurgle@apple.com>
  1054.   personal  mail  <mailto:gurgle@ccnet.com>
  1055.   personal  web   <http://www.ccnet.com/~gurgle>
  1056.   work      web   <http://dev.info.apple.com/dts.html>
  1057.  
  1058. +++++++++++++++++++++++++++
  1059.  
  1060. >From Paulo Casanova <l41188@alfa.ist.utl.pt>
  1061. Date: Sun, 3 Mar 1996 13:15:08 +0000
  1062. Organization: Instituto Superior Tecnico 
  1063.  
  1064.  
  1065. > As another Mac programming novice I would also like to know the answer to
  1066. > this question. It seems that one is able to either use LOCK to prevent a
  1067. > block of data (say the value of a variable) from being moved, or one can
  1068. > use a local variable to save the data before calling the "memory
  1069. > allocating" function. I read something about this in the Think Pascal
  1070. > manual, but I don't really understand it. Could people post me their
  1071. > replies too please?
  1072. > Thanks for the help
  1073. > Tom
  1074.  
  1075.   You guys must get a list of the toolbox functions that move memory. I 
  1076. use THINK reference. I think that there are more programs that will do.
  1077.  
  1078. Paulo
  1079.  
  1080. +++++++++++++++++++++++++++
  1081.  
  1082. >From sample@esltd.com (Don Sample)
  1083. Date: Tue, 05 Mar 1996 15:13:25 -0500
  1084. Organization: Enerprise Solutions Ltd
  1085.  
  1086. In article <Pine.OSF.3.91.960303131349.28188J-100000@alfa.ist.utl.pt>,
  1087. Paulo Casanova <l41188@alfa.ist.utl.pt> wrote:
  1088. >
  1089. >  You guys must get a list of the toolbox functions that move memory. I 
  1090. >use THINK reference. I think that there are more programs that will do.
  1091. >
  1092. >Paulo
  1093.  
  1094. Generally it is safest to assume that all functions and procedures may
  1095. cause memory to move, for a few reasons:
  1096.  
  1097. 1:  Think Reference's indications on which functions move memory aren't
  1098. always correct.
  1099.  
  1100. 2:  Just because something doesn't move memory now, doesn't mean that it
  1101. won't move memory in some future OS release (or, if it is one of your own
  1102. functions, your next version).
  1103.  
  1104. 3:  Even if Apple's version of a routine doesn't move memory, who knows
  1105. what some of those 3rd party extensions you have loaded are doing with
  1106. routines they have patched.
  1107.  
  1108. There are a few functions, such as BlockMove, which are pretty safe to
  1109. assume will not move memory, but for the most part you are better safe
  1110. than sorry.
  1111.  
  1112. -- 
  1113. Don Sample (sample@esltd.com)           |  Quando Omni Flunkus
  1114. Enterprise Solutions Ltd.               |        Moritati
  1115. http://www.esltd.com/esl_people/sample/ |
  1116.  
  1117. ---------------------------
  1118.  
  1119. >From njaharve@undergrad.math.uwaterloo.ca (Private Pile)
  1120. Subject: Drawing behind TE fields
  1121. Date: Wed, 28 Feb 1996 22:37:42 GMT
  1122. Organization: University of Waterloo
  1123.  
  1124. I'm writing an App which requires some fairly basic use of TextEdit.
  1125. However, I want to have a picture behind my TE Field. Does anyone know
  1126. an good way to do this?
  1127.  
  1128. Would installing a custom DrawHook work, or is that only for drawing
  1129. text, not the background?
  1130.  
  1131. Thanks in advance,
  1132. Nick
  1133. -- 
  1134. "Just remember, Mr Fawlty, there's always somebody worse off than yourself."
  1135. "Is there? Well I'd like to meet him. I could do with a laugh."
  1136.  
  1137. +++++++++++++++++++++++++++
  1138.  
  1139. >From heaney@crl.com (John S. Heaney)
  1140. Date: 29 Feb 1996 03:27:00 -0800
  1141. Organization: CRL Dialup Internet Access    (415) 705-6060  [Login: guest]
  1142.  
  1143. In article <DnIC6u.Io@undergrad.math.uwaterloo.ca>,
  1144. Private Pile <njaharve@undergrad.math.uwaterloo.ca> wrote:
  1145. >I'm writing an App which requires some fairly basic use of TextEdit.
  1146. >However, I want to have a picture behind my TE Field. Does anyone know
  1147. >an good way to do this?
  1148.  
  1149. The best way I have found is to install a grafproc bottleneck routine for 
  1150. the StdRect routine. You install the bottleneck callback just before 
  1151. drawing your text and uninstall it just after. Your routine does nothing. 
  1152. This prevents TextEdit or TextBox from erasing the background. Oh yeah, 
  1153. you also have to set the text mode to srcOr.
  1154.  
  1155. Keep in mind that this works best for static text. If you want to scroll 
  1156. the text or change the text (like if it's editable) you have to refresh 
  1157. the background because you're drawing in srcOr mode. Otherwise, the text 
  1158. keeps writing over itself, which gets messy quickly.
  1159.  
  1160. -- 
  1161. John Heaney              Time flies whether you're having fun or not.
  1162. heaney@crl.com
  1163.  
  1164. +++++++++++++++++++++++++++
  1165.  
  1166. >From phixus@deltanet.com (Chris De Salvo)
  1167. Date: Fri, 01 Mar 1996 00:58:10 -0800
  1168. Organization: MacPlay
  1169.  
  1170. In article <DnIC6u.Io@undergrad.math.uwaterloo.ca>,
  1171. njaharve@undergrad.math.uwaterloo.ca (Private Pile) wrote:
  1172.  
  1173. >I'm writing an App which requires some fairly basic use of TextEdit.
  1174. >However, I want to have a picture behind my TE Field. Does anyone know
  1175. >an good way to do this?
  1176. >
  1177. >Would installing a custom DrawHook work, or is that only for drawing
  1178. >text, not the background?
  1179.  
  1180. There is sample code for this on Apple's ftp site.  I can't get in right
  1181. now otherwise I'd give the URL.
  1182.  
  1183. Actually, what you want to do is to replace the QuickDraw bottleneck
  1184. routines for rects and regions.  Specifically, you want to trap the
  1185. 'erase' GrafVerb.  Rather than filling with the current background color
  1186. like StdRect/StdRgn do you would blit in the appropriate area from your
  1187. graphic.
  1188.  
  1189. That's an overly simplistic answer but that's it in a nutshell.  If you go
  1190. to Apple's ftp site and look through the code snippets area you should
  1191. find it.  It's called something like TE Over Pict or something similar.
  1192.  
  1193. L8R
  1194. Chris
  1195.  
  1196. -- 
  1197. phixus@deltanet.com         |   Macintosh:  Changing the world,
  1198. Chris De Salvo              |        one person at a time!
  1199. Professional Mac Geek       |    -----------------------------
  1200. for MacPlay, Inc.           |      (I wish they'd hurry up!)
  1201.  
  1202.            http://www.deltanet.com/users/phixus
  1203.  
  1204. +++++++++++++++++++++++++++
  1205.  
  1206. >From phil_weiss@pdm-inc.com (Phil Weiss)
  1207. Date: 1 Mar 1996 20:52:38 GMT
  1208. Organization: American Information Systems, Inc.
  1209.  
  1210. In article <DnIC6u.Io@undergrad.math.uwaterloo.ca>,
  1211. njaharve@undergrad.math.uwaterloo.ca (Private Pile) wrote:
  1212.  
  1213. > I'm writing an App which requires some fairly basic use of TextEdit.
  1214. > However, I want to have a picture behind my TE Field. Does anyone know
  1215. > an good way to do this?
  1216. > Would installing a custom DrawHook work, or is that only for drawing
  1217. > text, not the background?
  1218. > Thanks in advance,
  1219. > Nick
  1220. > -- 
  1221. > "Just remember, Mr Fawlty, there's always somebody worse off than yourself."
  1222. > "Is there? Well I'd like to meet him. I could do with a laugh."
  1223.  
  1224.  
  1225.   What happens is 'TEUpdate' calls 'EraseRect'.  So, what worked for me
  1226. was to patch 'EraseRect' before calling 'TEUpdate':
  1227.  
  1228.  
  1229. savdAddr = gettrapaddress of 'EraseRect';
  1230.  
  1231. SetTrapAddress of 'EraseRect' to your own 'MyEraseRect';  which does nothing.
  1232.  
  1233. Call 'TEUpdate'.
  1234.  
  1235. SetTrapAddress of 'EraseRect' back to savdAddr.
  1236.  
  1237. -- 
  1238. Phil
  1239.  
  1240. ---------------------------
  1241.  
  1242. >From midiland@internetMCI.COM (Kenneth Wayne Land)
  1243. Subject: How Often Do I Lock a Handle?
  1244. Date: Mon, 26 Feb 1996 23:56:50 -0500
  1245. Organization: InternetMCI
  1246.  
  1247. I am programming in C using CodeWarrior 68K.  If I have a function that
  1248. needs to lock a handle to some data and while that handle is locked, I
  1249. call another function that gets a handle to the same data, does the second
  1250. handle also need to be locked  (assuming both functions make toolbox calls
  1251. that may move the data)?  In other words, is it necessary to "nest" HLock
  1252. and HUnlock when more than one function is accessing the same data, each
  1253. using it's on allocated handle?  Or should I be passing the handle to the
  1254. second function?  Any help is much appreciated.  The people in this news
  1255. group are GREAT!  Thanks!
  1256.  
  1257. Wayne Land, Ft. Lauderdale, FL
  1258. (trying to develop some music education software)
  1259.  
  1260. +++++++++++++++++++++++++++
  1261.  
  1262. >From "Andrew C. Plotkin" <erkyrath+@CMU.EDU>
  1263. Date: Tue, 27 Feb 1996 01:17:48 -0500
  1264. Organization: Carnegie Mellon, Pittsburgh, PA
  1265.  
  1266. midiland@internetMCI.COM (Kenneth Wayne Land) writes:
  1267. >  If I have a function that
  1268. > needs to lock a handle to some data and while that handle is locked, I
  1269. > call another function that gets a handle to the same data, does the second
  1270. > handle also need to be locked  (assuming both functions make toolbox calls
  1271. > that may move the data)?  In other words, is it necessary to "nest" HLock
  1272. > and HUnlock when more than one function is accessing the same data, each
  1273. > using it's on allocated handle?
  1274.  
  1275. No; in fact, you shouldn't nest them.
  1276.  
  1277. You're really locking and unlocking the *data*, not the handle.
  1278. (Actually this is a terminological nightmare; NIM generally uses the
  1279. word "handle" when they're talking about the data, so it makes sense
  1280. for them to say "locking the handle", but it leaves a lot of confused
  1281. newbies.) If two functions have Handle variables which point to the
  1282. same data, and one of them calls HLock on it, the data will be locked
  1283. for both. 
  1284.  
  1285. You can see why nesting HLock / HUnlock is bad: 
  1286. FuncA locks handle (now the data is locked)
  1287. FuncA calls FuncB
  1288.   FuncB locks handle (this has no effect, since it's already locked)
  1289.   FuncB does work
  1290.   FuncB unlocks handle (now the data is unlocked)
  1291.   FuncB returns
  1292. FuncA does work (crash, since the data is unlocked now)
  1293.  
  1294. If your program style requires this sort of nesting, you can use
  1295. HGetState and HSetState to store a handle's state, HLock it, and then
  1296. return the handle to the stored state. 
  1297.  
  1298. Or you can decide that some functions lock handles, and other
  1299. functions require their handles to be locked, and make sure the second
  1300. kind is only called from the first kind. (Hint: comment each
  1301. function.)
  1302.  
  1303. --Z
  1304.  
  1305. "And Aholibamah bare Jeush, and Jaalam, and Korah: these were the borogoves..."
  1306.  
  1307. +++++++++++++++++++++++++++
  1308.  
  1309. >From midiland@internetMCI.COM (Kenneth Wayne Land)
  1310. Date: Tue, 27 Feb 1996 13:27:49 -0500
  1311. Organization: InternetMCI
  1312.  
  1313. In article <IlAe8AG00WB74eowh9@andrew.cmu.edu>, "Andrew C. Plotkin"
  1314. <erkyrath+@CMU.EDU> wrote:
  1315.  
  1316. > No; in fact, you shouldn't nest them.
  1317. > You're really locking and unlocking the *data*, not the handle.
  1318. > (Actually this is a terminological nightmare; NIM generally uses the
  1319. > word "handle" when they're talking about the data, so it makes sense
  1320. > for them to say "locking the handle", but it leaves a lot of confused
  1321. > newbies.) If two functions have Handle variables which point to the
  1322. > same data, and one of them calls HLock on it, the data will be locked
  1323. > for both. 
  1324.  
  1325. Thanks so very much for responding.  This is an area that should be more
  1326. clearly explained in many texts and is not.  I say again, this newsgroup
  1327. is "fabulous".
  1328.  
  1329. ---------------------------
  1330.  
  1331. >From jdf7@po.cwru.edu (Jeremy Friesen)
  1332. Subject: Limiting the mouse region
  1333. Date: 27 Feb 1996 06:17:39 GMT
  1334. Organization: Singularity
  1335.  
  1336. Ok, so here's a mouse cursor problem.
  1337.  
  1338. I'm hiding the mouse cursor, and using the mouse position to control a
  1339. simple game. I grabbed the screen bounds and use them to scale the mouse
  1340. input, so that maximum movement is at the edges of the screen. This works
  1341. great, until today I plugged a second monitor into my mac for the first
  1342. time today.  So now what happens is that the mouse is able to move off the
  1343. main screen onto the secondary screen during game play, even though the
  1344. actual cursor is hidden. This is a problem, because since the edge of the
  1345. main screen is calibrated to be maximum movement, moving the mouse past
  1346. that edge causes major bad problems.  I could simply crop the mouse
  1347. position to be withing the main screen, but the cursor would still be off
  1348. on the other screen, and would take more movement to get mack within
  1349. bounds. So what I want is a way to keep the mouse cursor within a certain
  1350. rect or region.  Is this possible? If not, what other solutions are there?
  1351. Thanks very much.
  1352. _________________________________________________________________
  1353.               J E R E M Y         The J-Files
  1354.             F R I E S E N         The Jeremy's Out There...
  1355.          jdf7@po.cwru.edu         No web page for now.
  1356.                Assume reality is negligible...
  1357. _________________________________________________________________
  1358.  
  1359. +++++++++++++++++++++++++++
  1360.  
  1361. >From phixus@deltanet.com (Chris De Salvo)
  1362. Date: Wed, 28 Feb 1996 04:00:11 -0800
  1363. Organization: MacPlay
  1364.  
  1365. In article <jdf7-2702960117360001@b61896.student.cwru.edu>,
  1366. jdf7@po.cwru.edu (Jeremy Friesen) wrote:
  1367.  
  1368. >I'm hiding the mouse cursor, and using the mouse position to control a
  1369. >simple game. I grabbed the screen bounds and use them to scale the mouse
  1370. >input, so that maximum movement is at the edges of the screen. This works
  1371. >great, until today I plugged a second monitor into my mac for the first
  1372. >time today.  So now what happens is that the mouse is able to move off the
  1373. >main screen onto the secondary screen during game play, even though the
  1374. >actual cursor is hidden. This is a problem, because since the edge of the
  1375. >main screen is calibrated to be maximum movement, moving the mouse past
  1376. >that edge causes major bad problems.  I could simply crop the mouse
  1377. >position to be withing the main screen, but the cursor would still be off
  1378. >on the other screen, and would take more movement to get mack within
  1379. >bounds. So what I want is a way to keep the mouse cursor within a certain
  1380. >rect or region.  Is this possible? If not, what other solutions are there?
  1381. >Thanks very much.
  1382.  
  1383. 1)  What I do is hide the cursor, and then read mouse movement DELTAS. 
  1384. Rather than using the absolute position of the mouse in QuickDraw space to
  1385. position my cursor I keep my own variables for the mouse position.  I then
  1386. read how much the mouse has moved from the last time I checked.  I use
  1387. that delta to change my internal cursor coordinates.
  1388.  
  1389. I then just clip those coordinates against my game monitor bounds and I'm
  1390. done.  I haven't had any problems with this technique so far.
  1391.  
  1392. 2)  Another method that you could use would be to use the Cursor Devices
  1393. Manager.  It provides calls that allow you to change the mouse position. 
  1394. You could then check to see if the mouse moved outside your boundaries and
  1395. if it did, you could move it back to within your valid range.
  1396.  
  1397. Personally, I prefer #1.
  1398.  
  1399. Good luck,
  1400. Chris
  1401.  
  1402. -- 
  1403. phixus@deltanet.com         |   Macintosh:  Changing the world,
  1404. Chris De Salvo              |        one person at a time!
  1405. Professional Mac Geek       |    -----------------------------
  1406. for MacPlay, Inc.           |      (I wish they'd hurry up!)
  1407.  
  1408.            http://www.deltanet.com/users/phixus
  1409.  
  1410. ---------------------------
  1411.  
  1412. >From zinger@cloudnet.com (Chris S. Dillman)
  1413. Subject: MOVE 16
  1414. Date: 26 Feb 1996 20:21:29 GMT
  1415. Organization: Cloudnet, St. Cloud MN (612)-240-8259 login as guest
  1416.  
  1417. Hi out there.
  1418.  
  1419. I have seen mention of MOVE 16 command for use on 040s.
  1420. My questions are.
  1421. How dose it work?
  1422. Is it availible on all 040 including 040LC?
  1423. Can I get CW C/C++ to generate it?
  1424. LIke when i copy between 2 Ptr say (double*)ptr or somthing.
  1425.  
  1426. BYBY
  1427.  
  1428.  
  1429.  
  1430. +++++++++++++++++++++++++++
  1431.  
  1432. >From jregier@qualcomm.com (Jason Regier)
  1433. Date: Mon, 26 Feb 1996 13:52:40 -0800
  1434. Organization: Qualcomm, Inc.
  1435.  
  1436. In article <4gt4o9$uia@orion.cloudnet.com>, zinger@cloudnet.com (Chris S.
  1437. Dillman) wrote:
  1438. > I have seen mention of MOVE 16 command for use on 040s.
  1439. > How does it work? Is it availible on all 040 including 040LC?
  1440. > Can I get CW C/C++ to generate it?
  1441. >
  1442. MOVE16 is an instruction to copy 16 bytes from one address to another.  It
  1443. should be faster than 4 successive MOVE.L instructions, if only because it
  1444. eliminates the instruction fetches and other overhead.  From what I recall
  1445. from the Motorola handbooks, in order for it to work most efficiently,
  1446. your source and destination must both be aligned on 16 byte boundaries. 
  1447. And I think it's available on all 040s (including LC040 and EC040) and
  1448. higher 68K processors.   And yes, CW C/C++ (as with most good 68K
  1449. compilers) should generate MOVE16 instructions when appropriate.
  1450.  
  1451. Jason
  1452.  
  1453. -- 
  1454. Jason Regier
  1455. GlobalStar Software Engineer
  1456. QUALCOMM, Inc.
  1457. (619) 658-4752
  1458. jregier@qualcomm.com
  1459.  
  1460. +++++++++++++++++++++++++++
  1461.  
  1462. >From Andrew Barry <ajbarry@ozemail.com.au>
  1463. Date: Tue, 27 Feb 1996 11:52:38 +1000
  1464. Organization: Connect.com.au P/L, Sydney, Australia
  1465.  
  1466. > MOVE16 is an instruction to copy 16 bytes from one address to another.  It
  1467. > should be faster than 4 successive MOVE.L instructions, if only because it
  1468. > eliminates the instruction fetches and other overhead.  From what I recall
  1469. > from the Motorola handbooks, in order for it to work most efficiently,
  1470. > your source and destination must both be aligned on 16 byte boundaries.
  1471. > And I think it's available on all 040s (including LC040 and EC040) and
  1472. > higher 68K processors.   And yes, CW C/C++ (as with most good 68K
  1473. > compilers) should generate MOVE16 instructions when appropriate.
  1474.  
  1475. MOVE16 can only be used where source and destination are aligned to 16 byte 
  1476. boundaries. It works by copying the entire cache entry (which is 16 bytes long) - 
  1477. and also avoids having to load the cache if the destination block isn't currently 
  1478. in the cache. If you call it with an unaligned address, I think it just grabs the 
  1479. previous cache entry (ie it ignores the bottom four bits).
  1480.  
  1481. Additionally, other than the hand-coded implementation of memcpy, I wouldn't think 
  1482. that any 68k compiler would bother to try and generate MOVE16 instructions (don't 
  1483. overly flame me if I'm wrong) - since MOVE16 can only be used for large structure 
  1484. copies, and the compiler would presumably call a memcpy equivalent routine 
  1485. (there is a lot more 'lower hanging fruit' for optimisations).
  1486.  
  1487. Just my opinion...
  1488.  
  1489. Andrew Barry
  1490.  
  1491. +++++++++++++++++++++++++++
  1492.  
  1493. >From zinger@cloudnet.com (Chris S. Dillman)
  1494. Date: 27 Feb 1996 17:17:45 GMT
  1495. Organization: Cloudnet, St. Cloud MN (612)-240-8259 login as guest
  1496.  
  1497. Chris S. Dillman (zinger@cloudnet.com) wrote:
  1498. : Hi out there.
  1499.  
  1500. : I have seen mention of MOVE 16 command for use on 040s.
  1501. : My questions are.
  1502. : How dose it work?
  1503. : Is it availible on all 040 including 040LC?
  1504. : Can I get CW C/C++ to generate it?
  1505. : LIke when i copy between 2 Ptr say (double*)ptr or somthing.
  1506.  
  1507. : BYBY
  1508.  
  1509. Thanx guys
  1510.  
  1511. now whats a EC040 chip?
  1512.  
  1513.  
  1514.  
  1515.  
  1516. +++++++++++++++++++++++++++
  1517.  
  1518. >From jregier@qualcomm.com (Jason Regier)
  1519. Date: Tue, 27 Feb 1996 11:08:50 -0800
  1520. Organization: Qualcomm, Inc.
  1521.  
  1522. In article <4gvebp$9bu@orion.cloudnet.com>, zinger@cloudnet.com (Chris S.
  1523. Dillman) wrote:
  1524.  
  1525. > now whats a EC040 chip?
  1526.  
  1527. It's the Embedded Controller version of the 68040.  If I remember
  1528. correctly, it doesn't have an FPU or MMU.  All Macs come with either a
  1529. 68040 or a 68LC040, though, so it's not something you're likely to have to
  1530. worry about.  As far as I know, the EC040 is typically used in embedded
  1531. controller applications where you don't need floating point calculations.
  1532.  
  1533. Jason
  1534.  
  1535. -- 
  1536. Jason Regier
  1537. GlobalStar Software Engineer
  1538. QUALCOMM, Inc.
  1539. (619) 658-4752
  1540. jregier@qualcomm.com
  1541.  
  1542. +++++++++++++++++++++++++++
  1543.  
  1544. >From zinger@cloudnet.com (Chris S. Dillman)
  1545. Date: 28 Feb 1996 17:30:46 GMT
  1546. Organization: Cloudnet, St. Cloud MN (612)-240-8259 login as guest
  1547.  
  1548. Jason Regier (jregier@qualcomm.com) wrote:
  1549. : In article <4gvebp$9bu@orion.cloudnet.com>, zinger@cloudnet.com (Chris S.
  1550. : Dillman) wrote:
  1551.  
  1552. : > now whats a EC040 chip?
  1553.  
  1554. : It's the Embedded Controller version of the 68040.  If I remember
  1555. : correctly, it doesn't have an FPU or MMU.  All Macs come with either a
  1556. : 68040 or a 68LC040, though, so it's not something you're likely to have to
  1557. : worry about.  As far as I know, the EC040 is typically used in embedded
  1558. : controller applications where you don't need floating point calculations.
  1559.  
  1560. COOL thanx everyone.
  1561.  
  1562.  
  1563.  
  1564. +++++++++++++++++++++++++++
  1565.  
  1566. >From larson@base.cs.ucla.edu (Christopher Larson)
  1567. Date: 28 Feb 1996 16:43:49 GMT
  1568. Organization: UCLA, Computer Science Department
  1569.  
  1570. In article <jregier-2602961352400001@jregier-mac.qualcomm.com> jregier@qualcomm.com (Jason Regier) writes:
  1571. >In article <4gt4o9$uia@orion.cloudnet.com>, zinger@cloudnet.com (Chris S.
  1572. >Dillman) wrote:
  1573. >> I have seen mention of MOVE 16 command for use on 040s.
  1574. >> How does it work? Is it availible on all 040 including 040LC?
  1575. >> Can I get CW C/C++ to generate it?
  1576. >>
  1577. >MOVE16 is an instruction to copy 16 bytes from one address to another.  It
  1578. >should be faster than 4 successive MOVE.L instructions, if only because it
  1579. >eliminates the instruction fetches and other overhead.
  1580.  
  1581. Yup. MOVE16 uses the on-chip cache to perform the moves. As such, only
  1582. one read and one write are done to memory, instead of two reads and one
  1583. write.
  1584.  
  1585. >From what I recall
  1586. >from the Motorola handbooks, in order for it to work most efficiently,
  1587. >your source and destination must both be aligned on 16 byte boundaries. 
  1588.  
  1589. If memory serves, the source and destination _must_ be aligned on 16
  1590. byte boundries (might be wrong about this though; don't have my manual
  1591. here at work).
  1592.  
  1593. >And I think it's available on all 040s (including LC040 and EC040) and
  1594. >higher 68K processors.
  1595.  
  1596. It should be available on all 040 cpus.
  1597.  
  1598. >And yes, CW C/C++ (as with most good 68K
  1599. >compilers) should generate MOVE16 instructions when appropriate.
  1600.  
  1601. This is somewhat of a trickier issue. Since MOVE16 is not available on
  1602. cpus earlier than the 040, using the instruction will crash any Mac which
  1603. said older cpu. As such the only 'appropriate' time to generate such an
  1604. instruction is when you tell the compiler to specialize code for the 040.
  1605.  
  1606. The easiest way to use MOVE16 is to simply use BlockMoveData() to move your
  1607. data around. It uses the fastest general method to move data on whatever
  1608. cpu it's running on (which would be MOVE16 on 040s, other methods on earlier
  1609. cpus, and native instructions on PPC cpus).
  1610.  
  1611. If you have decided that BlockMoveData() is not fast enough for your taste
  1612. and are writing a specialized copy routine in assembly, please make sure
  1613. you are running on an 040 before you use MOVE16 (and provide another way to
  1614. copy if you're not). Also, I think the PPC emulator chokes on MOVE16, so
  1615. you'll want to provide a third way to copy on PPC machines, preferably
  1616. native code.
  1617.  
  1618. All in all, BlockMoveData() is the easiest way to go and it's pretty fast
  1619. as well. I'd strongly urge you to only hand-code assembly copy routines
  1620. if BlockMoveData() isn't fast enough. Of course, if you're simply trying
  1621. to learn assembly language, that's a different matter.
  1622.  
  1623. --Chris
  1624. _______________________________________________________________________________
  1625. Chris Larson -- Amateur Macintosh Geek, CoBase Research Assistant
  1626. L.A. Institute of Slowly and Painfully Working Out the Surprisingly Obvious
  1627. - -------------------------------------+---------------------------------------
  1628. (Insert Disclaimer Here)               | Who's the man ridin' in the sun?
  1629. UCLA Bruins--1995 NCAA Men's Basketball| Who's the man with the itchy gun?
  1630.              National Champions (yea!) | Who's the man who kills for fun?
  1631. Internet: larson@kingston.cs.ucla.edu  | Psycho Dad, Psycho Dad, PSYCHO DAD!
  1632.  
  1633. ---------------------------
  1634.  
  1635. >From Howard Salmon <captarm@azstarnet.com>
  1636. Subject: Making sense of memory management
  1637. Date: 24 Feb 1996 22:27:04 GMT
  1638. Organization: Arizona Daily Star - AZSTARNET
  1639.  
  1640. I'm a beginning Mac "programmer"--I trying to teach myself about Mac 
  1641. programming by slogging thru Apple's Inside Macintosh cd rom.  My method 
  1642. is to try to understand one subject at a time, but since everything is 
  1643. interretlated, it's slow going.  Still, I persist.
  1644.  
  1645. Here's a quote from the Inside Mac book on "Memory":(my questions and 
  1646. comments are in parentheses):
  1647.  
  1648. "Master pointers for relocatable objects in your heap are always 
  1649. allocated in your application heap. Because the blocks of master 
  1650. pointers are nonrelocatable, it is best to allocate them as low in your 
  1651. heap as possible. (Literally, how do you do this?)
  1652.  
  1653. You can do this by calling the MoreMasters procedure when your 
  1654. application starts up." (What's that mean?  To write "MoreMasters" at 
  1655. the top of your source code?)
  1656.  
  1657. All nuggets of knowledge welcome.  Thanks--Howard Salmon
  1658.  
  1659.  
  1660.  
  1661. +++++++++++++++++++++++++++
  1662.  
  1663. >From j-jahnke@uchicago.edu (Jerome Jahnke)
  1664. Date: Sun, 25 Feb 1996 00:01:00 GMT
  1665. Organization: BSD Academic Computing
  1666.  
  1667. In article <4go3bo$iug@news.azstarnet.com>, Howard Salmon
  1668. <captarm@azstarnet.com> wrote:
  1669.  
  1670. > I'm a beginning Mac "programmer"--I trying to teach myself about Mac 
  1671. > programming by slogging thru Apple's Inside Macintosh cd rom.  My method 
  1672. > is to try to understand one subject at a time, but since everything is 
  1673. > interretlated, it's slow going.  Still, I persist.
  1674.  
  1675. This is probably NOT the best way to do this, given it's interelatedness.
  1676. To my experience I have found that finding a project to do and then
  1677. learning what you need to know to do the project seems to work best for
  1678. me.
  1679.  
  1680. Then once you have the basics down (i.e. you got a working program) you go
  1681. back and scour the docs looking for ways to tweak. But to each his own.
  1682.  
  1683. > Here's a quote from the Inside Mac book on "Memory":(my questions and 
  1684. > comments are in parentheses):
  1685. > "Master pointers for relocatable objects in your heap are always 
  1686. > allocated in your application heap. Because the blocks of master 
  1687. > pointers are nonrelocatable, it is best to allocate them as low in your 
  1688. > heap as possible. (Literally, how do you do this?)
  1689.  
  1690. You do this by calling MoreMasters a mess of times first off. How many
  1691. times do you call MoreMasters?? Well this one is a bit more difficult to
  1692. say. I gauge it by running the great tool ZoneRanger and watching what my
  1693. heap is up to. If all of a sudden I get a bunch of non relocateable blocks
  1694. in the middle of my heap I know I need to add at least one more call of
  1695. MoreMasters to my app. You don't really have to call it, if you are
  1696. dealing with tiny handles and such islands in your heap are not a big
  1697. issue. But if you need huge contigious spaces say for big bitmaps and
  1698. such. Then MoreMasters becomes and important toolbox call.
  1699.  
  1700. > You can do this by calling the MoreMasters procedure when your 
  1701. > application starts up." (What's that mean?  To write "MoreMasters" at 
  1702. > the top of your source code?)
  1703.  
  1704. Best place is in your main function. Set stuff up and before you program
  1705. gets seroius about running call MoreMasters as many times as you need it.
  1706. It helps to prevent against islands forming in your heap which might make
  1707. it impossible for you to open big objects.
  1708.  
  1709. Jer,
  1710.  
  1711. -- 
  1712. Jerome Jahnke
  1713. BSD Academic Computing
  1714. University of Chicago
  1715. j-jahnke@uchicago.edu
  1716.  
  1717. +++++++++++++++++++++++++++
  1718.  
  1719. >From Muff@winternet.com (MuffinHead)
  1720. Date: Sun, 25 Feb 1996 14:03:01 -0600
  1721. Organization: Armpit Studios VIII
  1722.  
  1723. In article <4go3bo$iug@news.azstarnet.com>, Howard Salmon
  1724. <captarm@azstarnet.com> wrote:
  1725.  
  1726. >You can do this by calling the MoreMasters procedure when your 
  1727. >application starts up." (What's that mean?  To write "MoreMasters" at 
  1728. >the top of your source code?)
  1729.  
  1730.    Yes. A common thing to do is to call MoreMasters a few times after
  1731. you've inited all the toolbox stuff. Small apps can make do with 1 or 2
  1732. calls to MoreMasters. Larger apps might need more. The point of calling
  1733. this early is to get the master pointers allocated early (and low in the
  1734. heap) before you start loading in all sorts of other blocks.
  1735.    Use ZoneRanger to watch the block in memory. If you're using
  1736. CodeWarrior, it's on the CD. Otherwise look around the usual archive sites
  1737. for it. Step through your program and watch how pointers and handles move
  1738. around (or don't move in the case of pointers). When you start seeing lots
  1739. of non-relocatable blocks strung out haphazardly in the heap, this is
  1740. what's known as heap fragmentation. It's something you should avoid if you
  1741. can. ZoneRanger is a great tool for this.
  1742.  
  1743. MuffinHead
  1744. Drummer, Mac geek                                  Armpit Studios VIII
  1745. http://www.winternet.com/~muff/                    Plymouth, MN
  1746. ______________________________________________________________________
  1747. Goober says "hey".                      Gomer says "hey".
  1748.   --Gomer Pyle                            --Goober Pyle
  1749.  
  1750. +++++++++++++++++++++++++++
  1751.  
  1752. >From DaveZ@mailbag.com (David B. Zwiefelhofer)
  1753. Date: Wed, 28 Feb 1996 08:06:19 -0500
  1754. Organization: Utility Reduction Specialists, Inc.
  1755.  
  1756. > "Master pointers for relocatable objects in your heap are always 
  1757. > allocated in your application heap. Because the blocks of master 
  1758. > pointers are nonrelocatable, it is best to allocate them as low in your 
  1759. > heap as possible. (Literally, how do you do this?)
  1760.  
  1761. Call MoreMasters very early in your application's initialization
  1762. procedure. The point is, you want to call it before you start allocating
  1763. handles so that you don't end up fragmenting memory.
  1764.  
  1765. If you don't call it enough times (I think it allocates 64 master
  1766. pointers) the memory manager will call it for you, probably fragmenting
  1767. your heap. Call it early and call it often (well, often enough to cover
  1768. your needs). You should figure out the maximum number of handles your app
  1769. might need and call MoreMasters as many times as is required (i.e. twice
  1770. if you have more than 64, but less than 129 handles).
  1771.  
  1772. > You can do this by calling the MoreMasters procedure when your 
  1773. > application starts up." (What's that mean?  To write "MoreMasters" at 
  1774. > the top of your source code?)
  1775.  
  1776. Yes, like this:
  1777.  
  1778. MoreMasters; {Pascal}
  1779.  
  1780. or, I think, in C:
  1781.  
  1782. MoreMasters(); {C}
  1783.  
  1784. Good luck,
  1785.  
  1786. Dave
  1787.  
  1788. -- 
  1789. David B. Zwiefelhofer
  1790. Utility Reduction Specialists, Inc.
  1791. 1605 Monroe Street, Suite 110
  1792. Madison, WI  53211-2052
  1793. (608) 258-8965
  1794. (608) 258-9686 FAX
  1795.  
  1796. ---------------------------
  1797.  
  1798. >From moss@risc.sps.mot.com (Matthew Moss)
  1799. Subject: More than 255 chars with GetDialogItemText() ???
  1800. Date: 27 Feb 1996 13:55:26 -0600
  1801. Organization: Motorola, Inc. -- Austin,TX
  1802.  
  1803. Forgive me if I'm missing something obvious...
  1804.  
  1805. I have a dialog with a text edit field and need to retrieve its contents.
  1806. Using GetDialogItemText() will only fill a Str255... what call or set of
  1807. calls can I use to get everything typed into that field?
  1808.  
  1809. Thanx...
  1810.  
  1811. -- 
  1812. Matthew D Moss                                         RISC Software, Motorola
  1813. moss@risc.sps.mot.com                              http://www.mot.com/PowerPC/
  1814.  
  1815. +++++++++++++++++++++++++++
  1816.  
  1817. >From rick@kagi.com (Rick Holzgrafe)
  1818. Date: Thu, 29 Feb 1996 12:01:31 -0800
  1819. Organization: Semicolon Software
  1820.  
  1821. In article <4gvnjeINNsp@hood.sps.mot.com>, moss@risc.sps.mot.com (Matthew
  1822. Moss) wrote:
  1823.  
  1824. > I have a dialog with a text edit field and need to retrieve its contents.
  1825. > Using GetDialogItemText() will only fill a Str255... what call or set of
  1826. > calls can I use to get everything typed into that field?
  1827.  
  1828. I'm not sure that such calls exist. There may be a skanky hack somewhere,
  1829. but there's a better way.
  1830.  
  1831. If you have a field that large to be filled in, you probably shouldn't be
  1832. using the Dialog Manager to present its window. The Dialog Manager is
  1833. meant to be used only for smallish, uncomplicated windows. Its use for
  1834. anything else is deprecated because its interface gets clumsy (as you've
  1835. found) and it is slow and inflexible.
  1836.  
  1837. It's not that hard to roll your own window with a few text fields and
  1838. buttons in it, and manage it in your main event loop. That way you have
  1839. full control, including full access to the text in your fields. It may
  1840. sound like more work than you want to do, but it really is a better
  1841. solution -- and it's probably less work than a skanky hack to get at the
  1842. full text in your dialog field.
  1843.  
  1844. I know this wasn't the answer you were hoping for, but I hope it helps anyway.
  1845.  
  1846. -- Rick Holzgrafe
  1847.    Semicolon Software
  1848.    rick@kagi.com
  1849.    http://www.opendoor.com/Rick/Semicolon.html
  1850.  
  1851. +++++++++++++++++++++++++++
  1852.  
  1853. >From mouser@zercom.net (Martin-Gilles Lavoie)
  1854. Date: Mon, 04 Mar 1996 09:11:10 -0500
  1855. Organization: Groupimage, inc.
  1856.  
  1857. In article <4gvnjeINNsp@hood.sps.mot.com>, moss@risc.sps.mot.com (Matthew
  1858. Moss) wrote:
  1859.  
  1860. > Forgive me if I'm missing something obvious...
  1861. > I have a dialog with a text edit field and need to retrieve its contents.
  1862. > Using GetDialogItemText() will only fill a Str255... what call or set of
  1863. > calls can I use to get everything typed into that field?
  1864. > Thanx...
  1865.  
  1866. GetDialogItem() returns a handle as part of it's arguments.  If this
  1867. dialog item is either of
  1868.  
  1869.     editText
  1870.     editText + itemDisable
  1871.     statText
  1872.     statText + itemDisable
  1873.  
  1874. then the itemHandle returned will be a handle to the text data (no length
  1875. byte, and no null at the end--the handle's size fits the characters
  1876. only).  In pseudo-code, here's what you do:
  1877.  
  1878.     GetDialogItem(..., &itemHandle, ...)
  1879.     get handle state
  1880.     lock handle
  1881.     var stringSize is GetHandleSize of itemHandle
  1882.     copy *itemHandle into myBuffer using stringSize
  1883.     set byte stringSize of myBuffer to zero
  1884.     reset handle state
  1885.  
  1886. At this point, myBuffer contains a C string.
  1887.  
  1888. Basically, this returned itemHandle is a TERec.hText field.  The dialog
  1889. manager swaps this hText field for editText items when the insertion point
  1890. moves from one edit box to another (the dialog manager uses a single
  1891. TEHandle per dialog box, regardless of how many editable items you have).
  1892.  
  1893. MGL
  1894.  
  1895. -- 
  1896. Martin-Gilles Lavoie
  1897.  
  1898. [CYRNFR QB ABG ZVK BE BGUREJVFR NYGRE GUR OVGF VA GUVF ZRFFNTR.]
  1899.  
  1900. ---------------------------
  1901.  
  1902. >From timmyd@netcom.com (Tim DeBenedictis)
  1903. Subject: Multitasking w- WaitNextEvent()???
  1904. Date: Thu, 22 Feb 1996 20:49:15 GMT
  1905. Organization: NETCOM On-line Communication Services (408 261-4700 guest)
  1906.  
  1907. Howdy y'all!
  1908.  
  1909. I'm trying to implement a multitasking-friendly progress bar to use 
  1910. during long operations (e.g. copying 60 MB files, etc.) which take place 
  1911. outside of my main event loop.
  1912.  
  1913. To use this progress bar, one needs to periodically call my 
  1914. GUpdateProgressDialog() function while performing the long drawn-out 
  1915. operation.  My GUpdateProgressBar() function calls WaitNextEvent(), but 
  1916. does not actually remove the event from the message queue or process it 
  1917. at all:
  1918.  
  1919. WaitNextEvent ( 0, &event, 0, NULL );
  1920.  
  1921. So far, this seems to work OK: while the program is doing its 60-MB copy, 
  1922. I can definitely switch to other apps (like NCSA telnet, which I am using 
  1923. now) and "do stuff" in them.
  1924.  
  1925. However, it's not buttery-smooth as I'd like it to be.  If I switch out 
  1926. of my program, then switch back into it, it's very difficult to switch 
  1927. out again; I pretty much have to jam down the mouse button on the desktop 
  1928. until I get control again.
  1929.  
  1930. I can think of several possibilities for this:
  1931.  
  1932. 1) I am only making one call to WaitNextEvent() from within my function;
  1933. perhaps I should repeatedly call it until all non-NULL events have been 
  1934. removed?
  1935.  
  1936. 2) I am giving WaitNextEvent a zero sleep-time, allowing only minimal 
  1937. time for processing background tasks.  I tried bumping this up to 10, and 
  1938. while that didn't make much difference in ease of switching back and 
  1939. forth to other apps, it did tremendously lengthen the total amount of 
  1940. time needed for the operation (there's now a 1/6-sec pause on every 
  1941. WaitNextEvent() call!)
  1942.  
  1943. Does anybody have any other suggestions?  Other people must have tried 
  1944. this before, and I know it's possible: switching between apps while ZTerm 
  1945. or Netscape is downloading is instant and seamless.
  1946.  
  1947. In general, what's the best way to make an application 
  1948. background-task-friendly when it's going to be executing outside of its 
  1949. main event loop for a long time?
  1950.  
  1951. -Tim DeBenedictis
  1952. timmyd@netcom.com
  1953.  
  1954.  
  1955.  
  1956.  
  1957. +++++++++++++++++++++++++++
  1958.  
  1959. >From awiner@oracle.com (Adam Winer)
  1960. Date: Thu, 22 Feb 1996 21:36:45 -0800
  1961. Organization: Oracle Corporation
  1962.  
  1963. In article <timmydDn7363.Btu@netcom.com>, timmyd@netcom.com (Tim
  1964. DeBenedictis) wrote:
  1965.  
  1966. > Howdy y'all!
  1967. > I'm trying to implement a multitasking-friendly progress bar to use 
  1968. > during long operations (e.g. copying 60 MB files, etc.) which take place 
  1969. > outside of my main event loop.
  1970. > To use this progress bar, one needs to periodically call my 
  1971. > GUpdateProgressDialog() function while performing the long drawn-out 
  1972. > operation.  My GUpdateProgressBar() function calls WaitNextEvent(), but 
  1973. > does not actually remove the event from the message queue or process it 
  1974. > at all:
  1975. > WaitNextEvent ( 0, &event, 0, NULL );
  1976. [Text deleted]
  1977. > Does anybody have any other suggestions?  Other people must have tried 
  1978. > this before, and I know it's possible: switching between apps while ZTerm 
  1979. > or Netscape is downloading is instant and seamless.
  1980. > In general, what's the best way to make an application 
  1981. > background-task-friendly when it's going to be executing outside of its 
  1982. > main event loop for a long time?
  1983.  
  1984. Without touching on the issue of the sleep parameter, you need
  1985. to handle update events.  If a foreground application doesn't
  1986. handle its update events, background applications get no time.
  1987. The essential events to handle while busy-waiting in most programs are
  1988. update, suspend/resume, and activate.
  1989.  
  1990. -- Adam Winer
  1991. awiner@us.oracle.com
  1992.  
  1993. +++++++++++++++++++++++++++
  1994.  
  1995. >From bobclay@netins.net (Bob Clay)
  1996. Date: Sun, 25 Feb 1996 13:23:09 -0600
  1997. Organization: INS Info Services, Des Moines, Iowa, USA
  1998.  
  1999.  
  2000. > In general, what's the best way to make an application 
  2001. > background-task-friendly when it's going to be executing outside of its 
  2002. > main event loop for a long time?
  2003. > -Tim DeBenedictis
  2004. > timmyd@netcom.com
  2005.  
  2006. Tim,
  2007.  
  2008. IM definitely advises against doing extensive background processing, as
  2009. this bogs down the whole concept of cooperative multitasking. When done
  2010. correctly, the background process should, indeed, take longer. When you
  2011. receive a null event in the background, quickly do the minimum that you
  2012. can do and get out.
  2013.  
  2014. Very cpu intensive tasks that would suffer greatly in background execution
  2015. should be implemented via a modal dialog progress box, that way the
  2016. process has the cpu all to itself. 
  2017.  
  2018. I know many people might disagree with what I'm saying here, but this is
  2019. the correct way to do CMT on the Macintosh, as stated by Apple in IM. If
  2020. you really stop to think about it, this approach makes a lot of sense. 
  2021.  
  2022. When we get PMT on the Macintosh, things will change quite a bit. Until
  2023. then, I feel we should stick to the approved methods for cooperative
  2024. multitasking.
  2025. This is not a criticism of your technique, Tim, but of the whole concept
  2026. of hogging the processor while in the background.
  2027.  
  2028. Regards,
  2029.  
  2030. Bob Clay
  2031.  
  2032. +++++++++++++++++++++++++++
  2033.  
  2034. >From chris-b@cs.auckland.ac.nz (Chris Burns)
  2035. Date: Mon, 26 Feb 1996 11:58:07 +1300
  2036. Organization: HyperMedia Unit, Comp Sci, Auckland University
  2037.  
  2038. In article <timmydDn7363.Btu@netcom.com>, timmyd@netcom.com (Tim
  2039. DeBenedictis) wrote:
  2040.  
  2041. >Howdy y'all!
  2042. >
  2043. >I'm trying to implement a multitasking-friendly progress bar to use 
  2044. >during long operations (e.g. copying 60 MB files, etc.) which take place 
  2045. >outside of my main event loop.
  2046. >
  2047. >To use this progress bar, one needs to periodically call my 
  2048. >GUpdateProgressDialog() function while performing the long drawn-out 
  2049. >operation.  My GUpdateProgressBar() function calls WaitNextEvent(), but 
  2050. >does not actually remove the event from the message queue or process it 
  2051. >at all:
  2052. >
  2053. >WaitNextEvent ( 0, &event, 0, NULL );
  2054.  
  2055. WaitnextEvent *does* remove the event from the event queue.
  2056.  
  2057. Are you doing the I/O asynchronously? This is possibly the best way to
  2058. improve the responsiveness of the machine as the user interface is not
  2059. tied to the "long  operation" (ie the 60 MB copy). Doing async reads and
  2060. writes may help the speed too if they are on different devices and thus
  2061. overlapped (particularly if one or both are network based services).
  2062. You'll need to set up multiple buffers for the concurrent I/O and I'd look
  2063. at sheduling reads and writes from ioCompletion routines if possible. This
  2064. way you can set the WNE sleep time to a large value and still have a
  2065. responsive user interface and fast copy.
  2066.  
  2067. Chris B
  2068. - ---------------------------------------------------------------------
  2069. NewZealand:AucklandUniversity:ComputerScience:HyperMediaUnit:ChrisBurns
  2070. Internet: chris-b@cs.auckland.ac.nz
  2071. Phone:    +64 9 373-7599 x5602
  2072. Fax:      +64 9 373-7453                         Async, Therefore I Am.
  2073. - ---------------------------------------------------------------------
  2074.  
  2075. +++++++++++++++++++++++++++
  2076.  
  2077. >From y-tony@bu.edu (Yan Lee)
  2078. Date: 26 Feb 1996 01:22:37 GMT
  2079. Organization: Boston University
  2080.  
  2081. Bob Clay (bobclay@netins.net) wrote:
  2082. : Tim,
  2083.  
  2084. : IM definitely advises against doing extensive background processing, as
  2085. : this bogs down the whole concept of cooperative multitasking. When done
  2086. : correctly, the background process should, indeed, take longer. When you
  2087. : receive a null event in the background, quickly do the minimum that you
  2088. : can do and get out.
  2089.  
  2090. : Very cpu intensive tasks that would suffer greatly in background execution
  2091. : should be implemented via a modal dialog progress box, that way the
  2092. : process has the cpu all to itself. 
  2093.  
  2094. : I know many people might disagree with what I'm saying here, but this is
  2095. : the correct way to do CMT on the Macintosh, as stated by Apple in IM. If
  2096. : you really stop to think about it, this approach makes a lot of sense. 
  2097.  
  2098. : When we get PMT on the Macintosh, things will change quite a bit. Until
  2099. : then, I feel we should stick to the approved methods for cooperative
  2100. : multitasking.
  2101. : This is not a criticism of your technique, Tim, but of the whole concept
  2102. : of hogging the processor while in the background.
  2103.  
  2104. : Regards,
  2105.  
  2106. : Bob Clay
  2107.  
  2108. Does Thread Manager gives any solutions to this?  Is WNE the only way to 
  2109. allow background processing?  What if I was trying to make a not-so-cpu 
  2110. intensive game that probably takes a fraction of the cpu time?  Well, I 
  2111. guess WNE would solve the problem, but I do wonder whether the thread 
  2112. manager can do some stuff too.
  2113.  
  2114. Tony
  2115.  
  2116.  
  2117. +++++++++++++++++++++++++++
  2118.  
  2119. >From bobclay@netins.net (Bob Clay)
  2120. Date: Tue, 27 Feb 1996 01:22:18 -0600
  2121. Organization: INS Info Services, Des Moines, Iowa, USA
  2122.  
  2123.  
  2124. > Does Thread Manager gives any solutions to this?  Is WNE the only way to 
  2125. > allow background processing?  What if I was trying to make a not-so-cpu 
  2126. > intensive game that probably takes a fraction of the cpu time?  Well, I 
  2127. > guess WNE would solve the problem, but I do wonder whether the thread 
  2128. > manager can do some stuff too.
  2129. > Tony
  2130.  
  2131. I sure wish I could answer that question, but I am as unfamiliar with
  2132. Thread Manager as anybody. Perhaps someone could throw some light on the
  2133. subject?
  2134.  
  2135. Bob Clay
  2136.  
  2137. +++++++++++++++++++++++++++
  2138.  
  2139. >From jlamport@pomona.edu (insert amusing pseudonym here)
  2140. Date: Fri, 01 Mar 1996 07:27:25 GMT
  2141. Organization: Pomona College
  2142.  
  2143. In article <bobclay-2502961323090001@desm-21-26.dialup.netins.net>, bobclay@netins.net (Bob Clay) writes:
  2144. >
  2145. >> 
  2146. >> In general, what's the best way to make an application 
  2147. >> background-task-friendly when it's going to be executing outside of its 
  2148. >> main event loop for a long time?
  2149. >> 
  2150. >> -Tim DeBenedictis
  2151. >> timmyd@netcom.com
  2152. >
  2153. >Tim,
  2154. >
  2155. >IM definitely advises against doing extensive background processing, as
  2156. >this bogs down the whole concept of cooperative multitasking. When done
  2157. >correctly, the background process should, indeed, take longer. When you
  2158. >receive a null event in the background, quickly do the minimum that you
  2159. >can do and get out.
  2160.  
  2161. [snip]
  2162.  
  2163. >When we get PMT on the Macintosh, things will change quite a bit. Until
  2164. >then, I feel we should stick to the approved methods for cooperative
  2165. >multitasking.
  2166. >This is not a criticism of your technique, Tim, but of the whole concept
  2167. >of hogging the processor while in the background.
  2168.  
  2169. I think Tim was asking how _not_ to hog the processor. (Though it's not clear
  2170. whether he means while his app is in the foreground or in the background.)
  2171.  
  2172. Either way, is there any reason why you shouldn't just sprinkle any code that
  2173. takes execution away from your main event loop with SystemTask calls. (Do I
  2174. have that trap name right?  I don't have a copy of IM handy, so I'm not sure. 
  2175. I'm thinking of that thing you were supposed to call along with GetNextEvent
  2176. back in the days when there was no such thing as WaitNextEvent.)  That's what
  2177. _I_ would do, but I'm a newbie to mac programming, and if I'm misguided, I
  2178. would appreciate it if someone would explain the correct way to handle this!
  2179.  
  2180. (Actually, I think I would try to set up my app so that one way or another it
  2181. made it back the main even loop regularly, no matter what it was doing -- but I
  2182. can see that there are some places where that might not be possible.)
  2183.  
  2184. -jason
  2185.  
  2186. (please respond by email, since I don't visit this group often enough to catch
  2187. everything.)
  2188.  
  2189. (No, I don't have a cute .sig file.  And I NEVER use smileys.)
  2190.  
  2191. +++++++++++++++++++++++++++
  2192.  
  2193. >From gurgle@apple.com (Pete Gontier)
  2194. Date: Wed, 28 Feb 1996 15:10:54 -0800
  2195. Organization: Apple Computer, Inc.
  2196.  
  2197. In article <chris-b-2602961158070001@hmu104.hmu.auckland.ac.nz>,
  2198. chris-b@cs.auckland.ac.nz (Chris Burns) wrote:
  2199.  
  2200.  > >WaitNextEvent ( 0, &event, 0, NULL );
  2201.  > 
  2202.  > WaitnextEvent *does* remove the event from the event queue.
  2203.  
  2204. Not when you pass 0 for the event mask. :-)
  2205.  
  2206. - -
  2207.  
  2208.   Pete Gontier, Integer Poet, Apple Macintosh Developer Technical Support
  2209.  
  2210.   work      mail  <mailto:gurgle@apple.com>
  2211.   personal  mail  <mailto:gurgle@ccnet.com>
  2212.   personal  web   <http://www.ccnet.com/~gurgle>
  2213.   work      web   <http://dev.info.apple.com/dts.html>
  2214.  
  2215. +++++++++++++++++++++++++++
  2216.  
  2217. >From gurgle@apple.com (Pete Gontier)
  2218. Date: Wed, 28 Feb 1996 15:18:13 -0800
  2219. Organization: Apple Computer, Inc.
  2220.  
  2221. In article <timmydDn7363.Btu@netcom.com>,
  2222. timmyd@netcom.com (Tim DeBenedictis) wrote:
  2223.  
  2224.  > WaitNextEvent ( 0, &event, 0, NULL );
  2225.  > 
  2226.  > However, it's not buttery-smooth as I'd like it to be.  If I switch out 
  2227.  > of my program, then switch back into it, it's very difficult to switch 
  2228.  > out again; I pretty much have to jam down the mouse button on the desktop 
  2229.  > until I get control again.
  2230.  
  2231. My first guess is that your application is not servicing update evnts.
  2232. Your call to WaitNextEvent is not allowing them through. If you don't
  2233. service updates, things get sluggish all over. Check out:
  2234.  
  2235.    <URL:http://dev.info.apple.com/technotes/Archive/Toolbox/tb_37.html>
  2236.  
  2237.  > 1) I am only making one call to WaitNextEvent() from within my function;
  2238.  > perhaps I should repeatedly call it until all non-NULL events have been 
  2239.  > removed?
  2240.  
  2241. If you're updating your windows, null events should be the only other kind
  2242. you receive.
  2243.  
  2244.  > 2) I am giving WaitNextEvent a zero sleep-time...
  2245.  
  2246. That would explain sluggish background processing, but not lack of
  2247. responsiveness in your app.
  2248.  
  2249.  > Does anybody have any other suggestions?  Other people must have tried 
  2250.  > this before, and I know it's possible: switching between apps while ZTerm 
  2251.  > or Netscape is downloading is instant and seamless.
  2252.  
  2253. The suggestions about asynchronous i/o made by another poster were on the
  2254. right track, though I must confess I didn't read past the word
  2255. "asynchronous". :-)
  2256.  
  2257. - -
  2258.  
  2259.   Pete Gontier, Integer Poet, Apple Macintosh Developer Technical Support
  2260.  
  2261.   work      mail  <mailto:gurgle@apple.com>
  2262.   personal  mail  <mailto:gurgle@ccnet.com>
  2263.   personal  web   <http://www.ccnet.com/~gurgle>
  2264.   work      web   <http://dev.info.apple.com/dts.html>
  2265.  
  2266. +++++++++++++++++++++++++++
  2267.  
  2268. >From gurgle@apple.com (Pete Gontier)
  2269. Date: Wed, 28 Feb 1996 15:24:23 -0800
  2270. Organization: Apple Computer, Inc.
  2271.  
  2272. In article <bobclay-2702960122180001@desm-20-10.dialup.netins.net>,
  2273. bobclay@netins.net (Bob Clay) wrote:
  2274.  
  2275.  > > Does Thread Manager gives any solutions to this?  Is WNE the only way to 
  2276.  > > allow background processing?  What if I was trying to make a not-so-cpu 
  2277.  > > intensive game that probably takes a fraction of the cpu time?  Well, I 
  2278.  > > guess WNE would solve the problem, but I do wonder whether the thread 
  2279.  > > manager can do some stuff too.
  2280.  > 
  2281.  > I sure wish I could answer that question, but I am as unfamiliar with
  2282.  > Thread Manager as anybody. Perhaps someone could throw some light on the
  2283.  > subject?
  2284.  
  2285. Writing multi-threaded code is not necessarily simple, but the Thread
  2286. Manager API is simple enough. Basically you write a function which becomes
  2287. a new entry point into your application and pass the function's address to
  2288. the Thread Manager. Your main event loop should call YieldToAnyThread, and
  2289. the function you passed to the Thread Manager will be called. It, in turn,
  2290. should also call YieldToAnyThread periodically, and you're off and
  2291. running.
  2292.  
  2293. Thread Manager, paired with asynchronous i/o, can be a big performance
  2294. win. A thread can kick off an asynchronous call and put itself to sleep.
  2295. When the asynchronous call completes, the completion routine wakes up the
  2296. thread and the thread continues on its merry way. This means all sorts of
  2297. different i/o operations can be going on at once.
  2298.  
  2299. In the case of a file copy of a 600M file, another issue is probably also
  2300. the size of the chunks being read and written. At some point or another,
  2301. the machine has to go read off the disk, whether the call was asynchronous
  2302. or not. Reading big chunks can reduce responsiveness on many (slightly
  2303. older) Macs.
  2304.  
  2305. - -
  2306.  
  2307.   Pete Gontier, Integer Poet, Apple Macintosh Developer Technical Support
  2308.  
  2309.   work      mail  <mailto:gurgle@apple.com>
  2310.   personal  mail  <mailto:gurgle@ccnet.com>
  2311.   personal  web   <http://www.ccnet.com/~gurgle>
  2312.   work      web   <http://dev.info.apple.com/dts.html>
  2313.  
  2314. ---------------------------
  2315.  
  2316. >From dco6453@news.seattleu.edu (Dennis C. O'Brien)
  2317. Subject: Program to Program Communication (PPCInform, PPCStart)
  2318. Date: 3 Mar 1996 16:51:58 -0800
  2319. Organization: Seattle University, Seattle, WA, USA
  2320.  
  2321. Can anyone point me to some good (or even not so good) examples of using
  2322. the program-to-program communication routines PPCInform, PPCStart, PPCRead,
  2323. etc..  All I am trying to do at this point is to get one program to connect
  2324. to another and pass character strings between them.  I have looked all 
  2325. through the MacTech CD, the csmp archive that comes with CW7 and scanned
  2326. through the IM/IAC manual.  I see a lot of definitions of the routines
  2327. themselves but could really use an example to see how they work together.
  2328.  
  2329. TIA
  2330.  
  2331. Dennis
  2332.  
  2333. +++++++++++++++++++++++++++
  2334.  
  2335. >From 75300.1001@compuserve.com (C.K. Haun)
  2336. Date: Tue, 05 Mar 1996 04:56:39 -0700
  2337. Organization: Ravenware Software
  2338.  
  2339. > > Can anyone point me to some good (or even not so good) examples of using
  2340. > >the program-to-program communication routines PPCInform, PPCStart,
  2341. > PPCRead,
  2342. > > etc..  
  2343.  
  2344. The sample NonAppAppleEvents on the developer CD (and various mirrors)
  2345. uses PPC to pass data around, the two files AEDeamonPPCStuff.c and
  2346. AECDEV.PPC.c show how a control panel and a background-only app use PPC to
  2347. communicate.
  2348. C.K. Haun
  2349. Ravenware Software
  2350. 75300.1001@compuserve.com
  2351.                           The Mild Bunch
  2352. 1996 Royal Star 1300      1991 Voyager 1200       1990 Virago 750
  2353. 1993 Virago 535           1987 Reflex 225         <rent this space>
  2354.  
  2355. +++++++++++++++++++++++++++
  2356.  
  2357. >From jumplong@aol.com (Jump Long)
  2358. Date: 4 Mar 1996 00:24:59 -0500
  2359. Organization: America Online, Inc. (1-800-827-6364)
  2360.  
  2361. Dennis C. O'Brien wrote:
  2362. >Can anyone point me to some good (or even not so good) examples
  2363. >of using the program-to-program communication routines
  2364. >PPCInform, PPCStart, PPCRead, etc..  All I am trying to do at
  2365. >this point is to get one program to connect to another and pass
  2366. >character strings between them.  I have looked all  through the
  2367. >MacTech CD, the csmp archive that comes with CW7 and scanned
  2368. >through the IM/IAC manual.  I see a lot of definitions of the
  2369. >routines themselves but could really use an example to see how
  2370. >they work together.
  2371.  
  2372. Server Remote Control uses the PPC Toolbox for communications between the
  2373. client application and the server application. You can download Server
  2374. Remote Control with its source code from Apple's ftp server at
  2375. <ftp://sam.austin.apple.com/Apple.Support.Area/Developer_Services/Tool_Che
  2376. st/Interapplication_Communication/Server_Remote_Control_1.1/Server_Remote_C
  2377. ontrol_1.1.sit.hqx>.
  2378.  
  2379. I also wrote a very simple PPC Toolbox sample before I left Apple DTS last
  2380. summer. I looked for it on the Developer CD, but it's not there, so I just
  2381. uploaded it to my ftp directory and you can get it there at
  2382. <ftp://members.aol.com/JumpLong/PPCToolbox_Samples.sit.hqx>. I'll have to
  2383. make sure it gets on the Dev CD and Apple's ftp server in the future.
  2384.  
  2385. - Jim Luther
  2386.  
  2387. ---------------------------
  2388.  
  2389. >From cwatson@cam.org (Sean McBride)
  2390. Subject: Q: The OSErr type, and unreserved values....
  2391. Date: Sun, 03 Mar 1996 18:12:18 -0500
  2392. Organization: Communications Accessibles Montreal, Quebec Canada
  2393.  
  2394. I'm looking for a way for my functions to return errors nicely... If
  2395. during the course of excution a MacOS function returns an OSErr then I
  2396. return that, but if something goes wrong that isn't ToolBox related I
  2397. don't want to pass back an OSErr for fear of using a value that already
  2398. represents an error...
  2399.  
  2400. My question is: are there any values (OSErr) that are free to be used by
  2401. the programmer?  Values that are set aside and guarenteed not to be
  2402. returned by a ToolBox call?
  2403.  
  2404. Any help is appreciated, thanks...
  2405.  
  2406. _______________________________________________________________________
  2407.   H H      |                   |                                      |
  2408.   | |      | Sean McBride      |                                      |
  2409. H-C-C-O-H  | cwatson@cam.org   |       0010 1001 1010                 |
  2410.   | |      | Montreal, Canada  |                                      |
  2411.   H H      |                   |                                      |
  2412. - ---------------------------------------------------------------------
  2413.  
  2414. +++++++++++++++++++++++++++
  2415.  
  2416. >From jumplong@aol.com (Jump Long)
  2417. Date: 4 Mar 1996 00:09:39 -0500
  2418. Organization: America Online, Inc. (1-800-827-6364)
  2419.  
  2420. Sean McBride wrote:
  2421. >I'm looking for a way for my functions to return errors
  2422. >nicely... If during the course of excution a MacOS function
  2423. >returns an OSErr then I return that, but if something goes wrong
  2424. >that isn't ToolBox related I don't want to pass back an OSErr
  2425. >for fear of using a value that already represents an error...
  2426. >
  2427. >My question is: are there any values (OSErr) that are free to be
  2428. >used by the programmer?  Values that are set aside and
  2429. >guarenteed not to be returned by a ToolBox call?
  2430.  
  2431. Some people use positive values since they are used by the Macintosh OS
  2432. for fatal (SysError) errors. Since the system won't be returning from
  2433. those :), they are fairly safe to use inside your code. Just don't display
  2434. your internal errors in an error dialog - use a descriptive error message
  2435. instead.
  2436.  
  2437. Me... I usually just find a defined error code whose meaning fits (or is
  2438. close to) the problem found.
  2439.  
  2440. - Jim Luther
  2441.  
  2442. +++++++++++++++++++++++++++
  2443.  
  2444. >From Symantec/Scott Morison <SYMScott@devtools.symantec.com>
  2445. Date: Tue, 05 Mar 1996 09:14:16 +0000
  2446. Organization: Symantec Corporation
  2447.  
  2448. Sean McBride wrote: 
  2449. > My question is: are there any values (OSErr) that are free to be used by
  2450. > the programmer?  Values that are set aside and guarenteed not to be
  2451. > returned by a ToolBox call?
  2452.  
  2453.  
  2454. As long as you choose a value outside of Apple's range, you're ok...;-)
  2455.  
  2456. Apple has reserved a range of OSErr values for their own use. This range happens to 
  2457. be -32768 to 32767; i.e., the entire range of the OSErr type. Not much room left for 
  2458. outsiders.
  2459.  
  2460. A couple of suggestions: 
  2461.  
  2462. * Avoid negative values (-32768 to -1); Apple's got them pretty well tied up.
  2463.  
  2464. * Positive Error codes between 1000 and 19000 seem to be fairly scarce, but there's 
  2465. still no guarantee you won't bump heads, and moreover you need to be certain that 
  2466. whatever it is your error values are passed to doesn't just check for failure on 
  2467. negative values, as some OS functions do.
  2468.  
  2469. ** Instead of using OSErr as your return type, use a long. Three reasons: 
  2470.   1) You'll have values outside of the magic Apple reserved range; 
  2471.   2) on the PPC, longs are more efficient and in general require fewer instructions 
  2472. to process; 
  2473.   3) you'll still be able to receive error codes in the OSErr range without any type 
  2474. conversion fuss.
  2475.  
  2476. There's my 32 bits.
  2477.  
  2478. Scott Morison, Symantec Development Tools Technical Support tofu boy
  2479. .
  2480. - -----------------------------------------------------
  2481. For further information on this or any other C/C++/Pascal/Java issue, please feel 
  2482. free to write to Symantec's online Development Tools tech support zen masters: 
  2483. support@devtools.symantec.com,
  2484. or give us a ring at : 541/465-8470
  2485.  
  2486. +++++++++++++++++++++++++++
  2487.  
  2488. >From albtrssp@crocker.com (Kevin Tieskoetter)
  2489. Date: 6 Mar 1996 20:35:27 GMT
  2490. Organization: Albatross Productions
  2491.  
  2492. In article <313C05E8.49DA@devtools.symantec.com>
  2493. Symantec/Scott Morison <SYMScott@devtools.symantec.com> writes:
  2494.  
  2495. > ** Instead of using OSErr as your return type, use a long. Three reasons: 
  2496. >   1) You'll have values outside of the magic Apple reserved range; 
  2497. >   2) on the PPC, longs are more efficient and in general require fewer instructions 
  2498. > to process; 
  2499. >   3) you'll still be able to receive error codes in the OSErr range without any type 
  2500. > conversion fuss.
  2501.  
  2502.  
  2503. But be careful that nowhere in the calling chain does your long error
  2504. get converted to an OSErr - your carefully-protected error will
  2505. suddenly disappear.
  2506.  
  2507. -kevin
  2508.  
  2509. --
  2510. //----------------------------------------------------------------------
  2511.  
  2512.   Kevin Tieskoetter, Software Prestidigitator, Specular International
  2513. //----------------------------------------------------------------------
  2514.  
  2515. +++++++++++++++++++++++++++
  2516.  
  2517. >From gurgle@apple.com (Pete Gontier)
  2518. Date: Tue, 05 Mar 1996 11:39:38 -0800
  2519. Organization: Apple Computer, Inc.
  2520.  
  2521. In article <cwatson-0303961812180001@dynamicppp-245.hip.cam.org>, 
  2522. cwatson@cam.org (Sean McBride) wrote:
  2523.  
  2524.  > I'm looking for a way for my functions to return errors nicely... If
  2525.  > during the course of excution a MacOS function returns an OSErr then I
  2526.  > return that, but if something goes wrong that isn't ToolBox related I
  2527.  > don't want to pass back an OSErr for fear of using a value that already
  2528.  > represents an error...
  2529.  > 
  2530.  > My question is: are there any values (OSErr) that are free to be used by
  2531.  > the programmer?  Values that are set aside and guarenteed not to be
  2532.  > returned by a ToolBox call?
  2533.  
  2534. Sadly, no. What I do is define an error type which potentially has
  2535. information in addition to the 16-bit OSErr. The other information tells
  2536. me whether I'm dealing with an OSErr or something else like an internal
  2537. error. You can do this nicely with a simple 32-bit integer (long or
  2538. unsigned long) and bit-level operators. Write some macros or inline
  2539. functions to make it easy to construct these codes. For example:
  2540.  
  2541.     #define kErrType_OS         0x00010000
  2542.     #define kErrType_Internal   0x00020000
  2543.  
  2544.     #define MakeOSErr(x)        ((x) | kErrType_OS)
  2545.     #define MakeInternalErr(x)  ((x) | kErrType_Internal)
  2546.  
  2547.     #define CheckForError(x) (!!((x) & 0x0000FFFF))
  2548.  
  2549.     typedef unsigned long tErr;
  2550.  
  2551.     #ifndef __FILES__
  2552.     #   include <Files.h>
  2553.     #endif
  2554.  
  2555.     static tErr FSpGetFInfo_Glue (const FSSpec *fssP, FInfo *fi)
  2556.     {
  2557.         MakeOSErr (FSpGetFInfo (fssP,fi));
  2558.     }
  2559.  
  2560. - -
  2561.  
  2562.   Pete Gontier, Integer Poet, Apple Macintosh Developer Technical Support
  2563.  
  2564.   work      mail  <mailto:gurgle@apple.com>
  2565.   personal  mail  <mailto:gurgle@ccnet.com>
  2566.   personal  web   <http://www.ccnet.com/~gurgle>
  2567.   work      web   <http://dev.info.apple.com/dts.html>
  2568.  
  2569. ---------------------------
  2570.  
  2571. >From vtourang@chat.carleton.ca (Vince Tourangeau)
  2572. Subject: QD3D and Textures...
  2573. Date: 26 Feb 1996 05:10:07 GMT
  2574. Organization: Carleton University, Ottawa, Canada
  2575.  
  2576.  
  2577. I'm still trying to figure out how one orients a texture onto a surface in
  2578. QD3D/3DMF. For example, if I was writing my own software and was wrapping
  2579. a texture onto a sphere, I might use spherical polar coordinates. However,
  2580. there's no explicit code in QD3D (so far as I can tell, anyways) for doing
  2581. this. So how would such a texture be properly mapped onto a sphere using
  2582. QD3D? More generally, how is a texture mapped onto/oriented to an object?
  2583. Thanks,
  2584.     Vince
  2585.  
  2586.  
  2587. - --------------------------------------------------------------------
  2588. Vince Tourangeau
  2589. vtourang@chat.carleton.ca
  2590.  
  2591. Did you hear about the dyslexic, agnostic insomniac?
  2592. She stays awake at night, wondering if there's a dog.
  2593.  
  2594. +++++++++++++++++++++++++++
  2595.  
  2596. >From chaoyang@scf.usc.edu (Mark Chao-Kuang Yang)
  2597. Date: Mon, 26 Feb 96 10:05:57 GMT
  2598. Organization: Cram Softnology
  2599.  
  2600. There is no such a geometry as sphere in QD3D.  You will have to use trigrids 
  2601. to form a sphere.  Thus, you can assign each vertex in trigrid a texture 
  2602. coordinates.  Basically, that's how it is done.  If you are reading the sphere 
  2603. from a 3DMF file, you will have assign each vertex in the file a texture 
  2604. coordinate.  This is painful but I believe that it is the only way to do it.
  2605.  
  2606. In fact, if the sphere has a texture assigned to it in 3DMF, after you read 
  2607. the sphere in, it should still have the save texture after you rendered it.  
  2608. Just don't forget to submit the texture shader.  Otherwise, you won't see 
  2609. textures at all.
  2610.  
  2611. Mark Yang
  2612.  
  2613. In article <4grfbf$lfi@bertrand.ccs.carleton.ca>, vtourang@chat.carleton.ca 
  2614. (Vince Tourangeau) wrote:
  2615. >
  2616. >I'm still trying to figure out how one orients a texture onto a surface in
  2617. >QD3D/3DMF. For example, if I was writing my own software and was wrapping
  2618. >a texture onto a sphere, I might use spherical polar coordinates. However,
  2619. >there's no explicit code in QD3D (so far as I can tell, anyways) for doing
  2620. >this. So how would such a texture be properly mapped onto a sphere using
  2621. >QD3D? More generally, how is a texture mapped onto/oriented to an object?
  2622. >Thanks,
  2623. >        Vince
  2624. >
  2625. >
  2626. >----------------------------------------------------------------------
  2627. >Vince Tourangeau
  2628. >vtourang@chat.carleton.ca
  2629. >
  2630. >Did you hear about the dyslexic, agnostic insomniac?
  2631. >She stays awake at night, wondering if there's a dog.
  2632.  
  2633. - ---------------------------------------------------------------------------
  2634. email:  chaoyang@scf.usc.edu
  2635.         chyang@graphics.usc.edu
  2636.  
  2637. Home Page: http://asm1.usc.edu/ckyang.html
  2638.  
  2639. +++++++++++++++++++++++++++
  2640.  
  2641. >From vtourang@chat.carleton.ca (Vince Tourangeau)
  2642. Date: 27 Feb 1996 03:40:24 GMT
  2643. Organization: Carleton University, Ottawa, Canada
  2644.  
  2645. Okay, but how do I line up the texture/make sure the texture's oriented on
  2646. an object? ie, How do those UV things work?
  2647.     Vince
  2648.  
  2649.  
  2650.  
  2651. - --------------------------------------------------------------------
  2652. Vince Tourangeau
  2653. vtourang@chat.carleton.ca
  2654.  
  2655. Did you hear about the dyslexic, agnostic insomniac?
  2656. She stays awake at night, wondering if there's a dog.
  2657.  
  2658. +++++++++++++++++++++++++++
  2659.  
  2660. >From chaoyang@scf.usc.edu (Mark Chao-Kuang Yang)
  2661. Date: Tue, 27 Feb 96 08:32:58 GMT
  2662. Organization: Cram Softnology
  2663.  
  2664. It is not that hard, but it is hard to explain UV coordinate in email.  You 
  2665. can refer to QD3D references or books for it.
  2666.  
  2667. Basically, each point has its own UV coordinate.  The range of UV coordinate 
  2668. is 0 (zero) to 1.  They correspond to the texuture map space.
  2669.  
  2670. i.e. If you have a picture which has 640x480 in size, UV (0,0.5) = 0,240.  
  2671. Thus, at vertex which has UV (0,0.5) would have the color at 0,240 in the 
  2672. picture.
  2673.  
  2674. See, it's kind of fuzzy if you see the explaination above.  The best way is to 
  2675.  check out QD3D references or any computer graphics book about texture 
  2676. mapping.
  2677.  
  2678. Mark Yang
  2679.  
  2680. In article <4gtuf8$fph@bertrand.ccs.carleton.ca>, vtourang@chat.carleton.ca 
  2681. (Vince Tourangeau) wrote:
  2682. >Okay, but how do I line up the texture/make sure the texture's oriented on
  2683. >an object? ie, How do those UV things work?
  2684. >        Vince
  2685. >
  2686. >
  2687. >
  2688. >----------------------------------------------------------------------
  2689. >Vince Tourangeau
  2690. >vtourang@chat.carleton.ca
  2691. >
  2692. >Did you hear about the dyslexic, agnostic insomniac?
  2693. >She stays awake at night, wondering if there's a dog.
  2694.  
  2695. - ---------------------------------------------------------------------------
  2696. email:  chaoyang@scf.usc.edu
  2697.         chyang@graphics.usc.edu
  2698.  
  2699. Home Page: http://asm1.usc.edu/ckyang.html
  2700.  
  2701. +++++++++++++++++++++++++++
  2702.  
  2703. >From jaks@netcom.com (Eric Jackson)
  2704. Date: Wed, 28 Feb 1996 17:15:43 GMT
  2705. Organization: NETCOM On-line Communication Services (408 261-4700 guest)
  2706.  
  2707. In article <4grfbf$lfi@bertrand.ccs.carleton.ca>,
  2708. Vince Tourangeau <vtourang@chat.carleton.ca> wrote:
  2709. >
  2710. >I'm still trying to figure out how one orients a texture onto a surface in
  2711. >QD3D/3DMF. For example, if I was writing my own software and was wrapping
  2712. >a texture onto a sphere, I might use spherical polar coordinates. However,
  2713. >there's no explicit code in QD3D (so far as I can tell, anyways) for doing
  2714. >this. So how would such a texture be properly mapped onto a sphere using
  2715. >QD3D? More generally, how is a texture mapped onto/oriented to an object?
  2716. >Thanks,
  2717. >    Vince
  2718. >
  2719. >
  2720. >----------------------------------------------------------------------
  2721. >Vince Tourangeau
  2722. >vtourang@chat.carleton.ca
  2723. >
  2724. >Did you hear about the dyslexic, agnostic insomniac?
  2725. >She stays awake at night, wondering if there's a dog.
  2726.  
  2727. Well Vince I find that knothing says it better than an example so here you go
  2728. I am pasting this in from my code so sorry if the line breaks don't all work
  2729. out just perfectly but good luck with it anyway.
  2730.  
  2731. void MainView::ParameteriseParallelTrig(long NumberOfRows,
  2732.                                    long NumberOfColumns){
  2733.                                    
  2734. //This function is called to reparameterise our trigrid
  2735. //after it has been incorrectly parameterized to cancel out 
  2736. //the effects of perspective
  2737.                                    
  2738.     float    FloatNumberOfRows,FloatNumberOfColumns;
  2739.     short    j,k;
  2740.     TQ3Param2D            param2D;
  2741.     
  2742.     FloatNumberOfRows     = NumberOfRows;
  2743.     FloatNumberOfColumns = NumberOfColumns;
  2744.     
  2745.     TQ3AttributeSet        UVParamaterAttribute;
  2746.     
  2747.     for (j=0;j<NumberOfRows;j++)
  2748.         {
  2749.         //NumberRows of course is an input parameter to this function
  2750.                 
  2751.             FloatNumberOfColumns = NumberOfColumns;
  2752.             
  2753.             
  2754.             for (k=0;k<NumberOfColumns;k++)
  2755.             {
  2756.             param2D.u =2*(NumberOfColumns - k)/FloatNumberOfColumns;
  2757.             param2D.v =-2*(NumberOfRows - j)/FloatNumberOfRows;
  2758.             
  2759.             //The v values move forewards and backwards
  2760.  
  2761.             UVParamaterAttribute = Q3AttributeSet_New();
  2762.             
  2763.             //Q3AttributeSet_Add(TriGridData->vertices[(j*NumberOfColumns)+k].attributeSet,
  2764.             //                kQ3AttributeTypeShadingUV, ¶m2D);
  2765.             
  2766.             Q3AttributeSet_Add(UVParamaterAttribute,
  2767.                             kQ3AttributeTypeShadingUV, ¶m2D);
  2768.  
  2769.  
  2770.             if (this->fTriGrid)
  2771.             Q3TriGrid_SetVertexAttributeSet(this->fTriGrid,j,k,UVParamaterAttribute);
  2772.             
  2773.             Q3Object_Dispose(UVParamaterAttribute);
  2774.             
  2775.             }
  2776.         }
  2777. }
  2778.  
  2779.  
  2780. Good luck
  2781.  
  2782. Eric Jackson 
  2783. jaks@netcom.com
  2784.  
  2785.  
  2786. ---------------------------
  2787.  
  2788. >From rajadhyaksha.2@osu.edu (Ram Rajadhyaksha)
  2789. Subject: System 7 PopUp CDEF Shares MenuHandles?
  2790. Date: Tue, 05 Mar 1996 21:48:18 -0500
  2791. Organization: The Ohio State University
  2792.  
  2793. Hey, I have an application that has various pop-ups in each of it's
  2794. windows. As I found out when I have multiple documents open that if I
  2795. delete an item from a pop-up control in one window- the result also shows
  2796. up in every OTHER window that has the same control! Do all the controls
  2797. share the same MenuHandle? (This would really suck) Looking at the mHandle
  2798. field in the PopUpPrivateHandle of all the different controls shows the
  2799. same address. 
  2800.  
  2801. Am I doing something wrong? I'm creating them with NewControl() and
  2802. specifying the same resource ID for the menu. 
  2803.  
  2804. If I'm not doing something wrong, then would creating the control with a
  2805. "dummy" menu resource, deleting that menuHandle, creating a new menu
  2806. handle for each control work?
  2807.  
  2808. Weird...
  2809.  
  2810. --Ram
  2811.  
  2812. +++++++++++++++++++++++++++
  2813.  
  2814. >From dowdy@apple.com (Tom Dowdy)
  2815. Date: Wed, 6 Mar 1996 12:36:05 GMT
  2816. Organization: Apple Computer, Inc.
  2817.  
  2818. In article
  2819. <rajadhyaksha.2-0503962148180001@ts35-12.homenet.ohio-state.edu>,
  2820. rajadhyaksha.2@osu.edu (Ram Rajadhyaksha) wrote:
  2821.  
  2822. > Hey, I have an application that has various pop-ups in each of it's
  2823. > windows. As I found out when I have multiple documents open that if I
  2824. > delete an item from a pop-up control in one window- the result also shows
  2825. > up in every OTHER window that has the same control! Do all the controls
  2826. > share the same MenuHandle? (This would really suck) Looking at the mHandle
  2827. > field in the PopUpPrivateHandle of all the different controls shows the
  2828. > same address. 
  2829. > Am I doing something wrong? I'm creating them with NewControl() and
  2830. > specifying the same resource ID for the menu. 
  2831. > If I'm not doing something wrong, then would creating the control with a
  2832. > "dummy" menu resource, deleting that menuHandle, creating a new menu
  2833. > handle for each control work?
  2834.  
  2835. This is kinda from memory, because it's been a long time since
  2836. I had to fix this bug. 
  2837.  
  2838. The Pop Up Control adds the menu for you, if it is not already in the
  2839. menu bar.  It then removes this menu from the menu bar if it needed
  2840. to install it, when the control is deleted.
  2841.  
  2842. So, the best way to do this is to simply add the menu to the menu
  2843. bar yourself before the first doc, and delete it after the last one.
  2844. Optionally, you can just add it once at the begining of your
  2845. application.
  2846.  
  2847. -- 
  2848.  Tom Dowdy                  Internet: dowdy@apple.COM
  2849.  Apple Computer MS:302-3KS  UUCP: {sun,voder,amdahl,decwrl}!apple!dowdy
  2850.  1 Infinite Loop            AppleLink: DOWDY1
  2851.  Cupertino, CA 95014       
  2852.  "The 'Ooh-Ah' Bird is so called because it lays square eggs."
  2853.  
  2854. ---------------------------
  2855.  
  2856. >From Anders Wahlin <Anders.Wahlin@hum.gu.se>
  2857. Subject: Where can I get a CustomGetFolder that works?
  2858. Date: Mon, 4 Mar 1996 11:37:19 GMT
  2859. Organization: Gothenburg University
  2860.  
  2861. I need to have a CustomGetFolder function in my app. I have one now which 
  2862. works on all folders except for volume-folders. Are they special? So, 
  2863. does anyone know where I can get a CustomGetFolder that works?
  2864.  
  2865. Thank you.
  2866.  
  2867.  
  2868. +++++++++++++++++++++++++++
  2869.  
  2870. >From jumplong@aol.com (Jump Long)
  2871. Date: 4 Mar 1996 12:01:19 -0500
  2872. Organization: America Online, Inc. (1-800-827-6364)
  2873.  
  2874. Anders Wahlin wrote:
  2875. >I need to have a CustomGetFolder function in my app. I have one now
  2876. >which  works on all folders except for volume-folders. Are they special?
  2877. >So, does anyone know where I can get a CustomGetFolder that works?
  2878.  
  2879. You can get one I wrote from
  2880. <ftp://members.aol.com/JumpLong/MoreStandardFile.sit.hqx>. It is a sample
  2881. I started while in DTS. The C code is complete. The only part that's
  2882. incomplete  in the code is the balloon help (it still has the standard
  2883. balloon help which doesn't make complete sense and doesn't handle the
  2884. additional buttons I added to the dialog).
  2885.  
  2886. The archive includes both a StandardSelectVolume and a StandardGetFolder
  2887. function. The StandardGetFolder also has the added the features of:
  2888. 1) optionally restricting the selected folder to visible folders.
  2889. 2) optionally restricting the selected folder to folders the user has
  2890. write access to.
  2891.  
  2892. - Jim Luther
  2893.  
  2894. ---------------------------
  2895.  
  2896. >From dmgreer@airmail.net (Dale M. Greer)
  2897. Subject: Wrapping Pictures Around Closed QD3D Surfaces
  2898. Date: Thu, 29 Feb 1996 01:22:35 -0600
  2899. Organization: Studio Zero
  2900.  
  2901. Wrapping Pictures Around Closed QD3D Surfaces
  2902.  
  2903. Many thanks to Jesse Holle for giving me the clue I needed to make
  2904. pictures wrap completely around closed QD3D surfaces.  For anyone else
  2905. who encounters this problem, here it is restated with the solution.
  2906.  
  2907.  
  2908. Suppose you are creating a mesh and you want a surface that's like a
  2909. short section of pipe.  The indices of the vertices of this surface look
  2910. like this.
  2911.  
  2912.  0   1   2   3   4
  2913.  5   6   7   8   9
  2914.  
  2915. >From the top - 
  2916.   the first row looks like this  -  and the second row looks like this.
  2917.  
  2918.               0 1                                 5 6
  2919.              4   2                               9   7
  2920.                3                                   8
  2921.  
  2922. You make triangular faces for the surface, where each number in each
  2923. triplet is the index of one of the vertices m
  2924.  
  2925. aking up the face.  For
  2926. example, the first face has indices 5,0,1, the second has 5,1,6, the
  2927. third has 6,1,2, etc.
  2928.  
  2929. When you get to the end, you want the last two faces to link up to the
  2930. first two vertices, to make a closed surface, so the last two faces have
  2931. indices like so - 9,4,0, and 9,0,5.
  2932.  
  2933. Now you want to put uv parameters on each vertex, so you can map a picture 
  2934. over the entire surface.  To get a complete picture, u and v must range 
  2935. from 0.0 to 1.0.  If vertices 0,1,2,3,4 have u-values of 0.0, 0.25, 0.5, 
  2936. 0.75, 1.0, you get the whole picture but you also get a gap where the last 
  2937. two faces link up with the first two vertices.  You can't fix this by 
  2938. having u-values of 0.0, 0.2, 0.4, 0.6, 0.8, 1.0, because there is no place 
  2939. for the 1.0 to go.  Vertex zero needs to have two u-values of both 0.0 and 
  2940. 1.0, as does vertex 5.
  2941.  
  2942. You can't do that with QuickDraw 3D's vertex attributes, but you can do
  2943. it with corner attributes.  Each vertex can have as many corners as it
  2944. has faces connected to it.  One problem is that in order to use uv
  2945. corner attributes to map a portion of a picture onto a face, the face
  2946. must have as many corner attributes as it has vertices.  With vertex
  2947. attributes, the value at each vertex is good for all connected faces, but
  2948. with corner attributes, the value is only good for one face.  If you
  2949. use corner attributes for uv mapping, you have to use many more of them that
  2950. you would use of vertex attributes.
  2951.  
  2952. I solved that problem by mapping all around with vertex attributes and
  2953. then adding corner attributes for the last column of faces.  In the
  2954. above example, vertices 0,1,2,3,4 would be mapped as 0.0, 0.2, 0.4,
  2955. 0.6, 0.8.  Then vertices 4 and 9 of face 9,4,0 would both get corner
  2956. attribute u-values of 0.8, with vertex 0 getting a corner attribute
  2957. u-value of 1.0.  Vertex 9 of face 9,0,5 would have a u-value of 0.8,
  2958. with vertices 0 and 5 of that face both getting u-values of 1.0.
  2959.  
  2960. -- 
  2961. Dale Greer, dmgreer@airmail.net
  2962. "I'm tryin' ta think, but nutt'n happens!" - Curley
  2963.  
  2964. ---------------------------
  2965.  
  2966. >From Sven Olsson <sven.olsson@signal.se>
  2967. Subject: [Q] Building Popup-menus at runtime
  2968. Date: 6 Mar 1996 14:48:08 GMT
  2969. Organization: -
  2970.  
  2971. Hi there,
  2972. I´m having som truoble building popup menus at runtime. The following code
  2973. does the trick except that nothing shows up in the control when drawn,
  2974. You have to click on the control and select an item before the text is 
  2975. displayed.
  2976.  
  2977. If I´ve forgotten or misunderstood something, please let me know:-)  
  2978.  
  2979. Thanks in advance,
  2980. Per 
  2981.  
  2982. my code:
  2983.  
  2984.    theControl = dataPtr->theHPDPopup;
  2985.    theMenu =(MenuHandle)GetCRefCon(theControl);
  2986.                 
  2987.    // Build List
  2988.    hpdHandle=gNorsonic.hpdRecListHandle;
  2989.         
  2990.    // Make sure menu is empty before building a new
  2991.    UnBuildPopup(theMenu);
  2992.  
  2993.    while(hpdHandle)
  2994.    {
  2995.       ...
  2996.  
  2997.       AppendMenu(theMenu, (unsigned char *)buffer);
  2998.       hpdHandle=(**hpdHandle).nextHPDHandle;  
  2999.    }
  3000.         
  3001.    hpdHandle=dataBasePtr->selectedHPDHandle;
  3002.    selected = (short)FindHPDOrderNumber(hpdHandle);
  3003.    SetControlValue(theControl, selected);
  3004.  
  3005.  
  3006.  
  3007. +++++++++++++++++++++++++++
  3008.  
  3009. >From rajadhyaksha.2@osu.edu (Ram Rajadhyaksha)
  3010. Date: Wed, 06 Mar 1996 10:44:56 -0500
  3011. Organization: The Ohio State University
  3012.  
  3013. In article <4hk8j8$h65@mn5.swip.net>, Sven Olsson <sven.olsson@signal.se> wrote:
  3014.  
  3015. >Hi there,
  3016. >I´m having som truoble building popup menus at runtime. The following code
  3017. >does the trick except that nothing shows up in the control when drawn,
  3018. >You have to click on the control and select an item before the text is 
  3019. >displayed.
  3020.  
  3021. >   theControl = dataPtr->theHPDPopup;
  3022. >   theMenu =(MenuHandle)GetCRefCon(theControl);
  3023.  
  3024. Are you using the Sys. 7 CDEF? Then to get to the menuhandle, you need
  3025. to dereference the ContrlData field and cast it into a PopUpPrivDataHndl,
  3026. dereference that, and then you can get the correct mHandle.
  3027.  
  3028. ie:       myMenuHandle =
  3029. ((**(PopupPrivateDataHandle)((**myPopUpControlHandle).contrlData)).mHandle);
  3030.                 
  3031. --Ram
  3032.  
  3033. +++++++++++++++++++++++++++
  3034.  
  3035. >From DaveZ@mailbag.com (David B. Zwiefelhofer)
  3036. Date: Wed, 06 Mar 1996 10:58:17 -0500
  3037. Organization: Utility Reduction Specialists, Inc.
  3038.  
  3039. In article <4hk8j8$h65@mn5.swip.net>, Sven Olsson <sven.olsson@signal.se> wrote:
  3040.  
  3041. > Hi there,
  3042. > I´m having som truoble building popup menus at runtime. The following code
  3043. > does the trick except that nothing shows up in the control when drawn,
  3044. > You have to click on the control and select an item before the text is 
  3045. > displayed.
  3046.  
  3047. [code snipped]
  3048.  
  3049. All you need to do beyond this is setControlMaximum so the control knows
  3050. what values it can take on. If you don't know how many items you've
  3051. appended use CountMItems and then use the result with setControlMaximum. 
  3052.  
  3053. You might also want to use the popupPrivateData structure to access the
  3054. control's menu in a clean and easy manner. It's not clear to me how you
  3055. are currently doing it.
  3056.  
  3057. Good luck,
  3058.  
  3059. Dave
  3060.  
  3061. SetControlMaximum(theControl, maxValue);
  3062.  
  3063. The Pop-Up Menu Private Data Record Control Manager
  3064. Inside Macintosh: Macintosh Toolbox Essentials,  page 5-77. 
  3065. #include <Controls.h>   
  3066.  
  3067. You can obtain the menu handle and the menu ID of the menu associated with
  3068. a pop-up menu by dereferencing the contrlData field of the pop-up menu’s
  3069. control record. The contrlData field of a control record is a handle to a
  3070. block of private information. For pop-up menu controls, this field is a
  3071. handle to a pop-up private data record, which is a data structure of type
  3072. popupPrivateData.
  3073. TYPE  popupPrivateData = 
  3074.    RECORD
  3075.       mHandle:    MenuHandle;                {handle to menu record}
  3076.       mID:        Integer;                   {menu ID}
  3077.       mPrivate:   ARRAY[0..0] OF SignedByte; {reserved}
  3078.    END;
  3079. Field Descriptions
  3080. mHandle     Contains a handle to the menu.
  3081. mID         The menu ID of the menu.
  3082. mPrivate    Reserved.
  3083. You can use the standard pop-up control definition function to manage
  3084. pop-up menus. For information on creating pop-up menus, see “Creating a
  3085. Pop-Up Menu” beginning on page 5-25 of Inside Macintosh: Macintosh Toolbox
  3086. Essentials. See the chapter “Menu Manager” in Inside Macintosh: Macintosh
  3087. Toolbox Essentials for additional information.
  3088.  
  3089. -- 
  3090. David B. Zwiefelhofer
  3091. Utility Reduction Specialists, Inc.
  3092. 1605 Monroe Street, Suite 110
  3093. Madison, WI  53211-2052
  3094. (608) 258-8965
  3095. (608) 258-9686 FAX
  3096.  
  3097. ---------------------------
  3098.  
  3099. End of C.S.M.P. Digest
  3100. **********************
  3101.  
  3102.